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 ответа:
Это вставит запись для каждого отдельного
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 в нескольких местах может легко привести к проблемам с данными, если при последующем запуске вы обновите только первое использование литерала.