SQL Server: вставка новой строки для каждого уникального значения в столбце 1


С помощью SQL Server я пытаюсь найти каждое уникальное значение в столбце 1 таблицы, а затем вставить новую строку, используя это уникальное значение столбца 1 и добавив значение столбца 2. Значение столбца 2 будет одинаковым каждый раз.

Чтобы отметить: я мог бы сделать это, вытащив уникальные значения из базы данных в столбце 1 и добавив вставку для каждого, но у меня есть 1,6 миллиона уникальных значений в столбце 1, поэтому было бы утомительно писать его таким образом.

Принимая 2 уникальных значения из столбца 1 в покажите это в качестве примера:

select *
from dbo.SettopSubscription
where MacAddr = '0000000ee4b5'
   or MacAddr = '0000003a9667'

Результаты:

MacAddr      PackageId   
------------ ----------- 
0000000ee4b5    11
0000000ee4b5     3
0000003a9667   241
0000003a9667   241
0000003a9667    11
0000003a9667   211
0000003a9667     8
0000003a9667  4411
0000003a9667  4412
0000003a9667  4479

Теперь я хочу добавить PackageId = 37 к каждому уникальному значению MacAddr, но пока не удается написать что-то, чтобы найти и добавить только уникальные значения. Как уже говорилось, Я могу сделать это легко, написав вставку в скрипт для каждого MacAddr, но это было сделано навсегда на 1,6 миллиона значений MacAddr.

Начальный вид, такой же, как и выше:

MacAddr      PackageId   
------------ ----------- 
0000000ee4b5    11
0000000ee4b5     3
0000003a9667   241
0000003a9667   241
0000003a9667    11
0000003a9667   211
0000003a9667     8
0000003a9667  4411
0000003a9667  4412
0000003a9667  4479

Конечный результат:

MacAddr      PackageId   
------------ ----------- 
0000000ee4b5    11
0000000ee4b5     3
***0000000ee4b5    37***
0000003a9667   241
0000003a9667   241
0000003a9667    11
0000003a9667   211
0000003a9667     8
0000003a9667  4411
0000003a9667  4412
0000003a9667  4479
***0000003a9667    37***

Спасибо за помощь заранее.

4 3

4 ответа:

Это вставит запись для каждого отдельного MacAddr с PackageId из 37, который уже не имеет PackageId из 37:

insert into SettopSubscription (MacAddr, PackageId)
select distinct s1.MacAddr, 37 
from SettopSubscription s1
where not exists
(
    select s2.PackageId
    from SettopSubscription s2
    where s2.MacAddr = s1.MacAddr
    and s2.PackageId = 37
);

К INSERT новой записи в таблицу SettopSubscription для каждого уникального значения MacAddr, с PackageId из 37 (не вставляя, если в таблице уже есть запись для этой комбинации MacAddr и PackageId:

INSERT INTO SettopSubscription (MacAddr, PackageId)
SELECT DISTINCT s1.MacAddr, 37 
FROM dbo.SettopSubscription s1
LEFT JOIN dbo.SettopSubscription s2 ON s1.MacAddr = s2.MacAddr 
                                   AND s2.PackageId = 37
WHERE s2.MacAddr IS NULL

Попробуйте это:

insert into dbo.SettopSubscription (MacAddr,PackageId)   
select MacAddr, 'your_PackageId_Value'  from 
(select count(dbo.SettopSubscription.MacAddr ) nbr, MacAddr  from
dbo.SettopSubscription group by MacAddr ) tmp where tmp.nbr=1

Похоже, вы хотите этого:

declare @pid int
set @pid=37
insert into dbo.SettopSubscription (macaddr, packageid)
select distinct ss.macaddr, @pid
from dbo.SettopSubscription ss
where not exists (
    select * from dbo.SettopSubscription ss2 
    where ss2.macaddr=ss.macaddr and ss2.packageid=@pid)

Для каждого уникального macaddr в столбце 1 это просто вставка записи с указанным вами именем пакета и проверка того, что комбинация еще не существует.

Я добавил переменную в предположении, что вы можете повторно использовать запрос. Размещение литерала 37 в нескольких местах может легко привести к проблемам с данными, если при последующем запуске вы обновите только первое использование литерала.