SQL 服务器:为第 1 列中的每个唯一值插入一个新行

SQL Server: Insert a new row for every unique value in column 1

使用 SQL 服务器 我试图在 table 的第 1 列中找到每个唯一值,然后使用该唯一的第 1 列值插入一个新行并添加第 2 列值。第 2 列的值每次都相同。

注意:我可以通过从第 1 列的数据库中提取唯一值并为每个添加一个插入来做到这一点,但我在第 1 列中有 160 万个唯一值,所以这样写会很烦人.

以第 1 列中的 2 个唯一值为例:

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 编写一个插入到脚本中来轻松地做到这一点,但这对 160 万个 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***

感谢您提前的帮助。

试试这个:

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

INSERT一条新记录到SettopSubscriptiontable每个唯一值MacAddr,与PackageId37 (如果 MacAddrPackageId 的组合在 table 中已有记录,则不插入:

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

听起来你想要这个:

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)

对于第 1 列中的每个唯一 macaddr,这只是插入一条包含您指定的 packageid 的记录,并确保该组合尚不存在。

我在假设您可以重用查询的情况下添加了变量。如果将来 运行,将文字 37 放在多个位置很容易导致数据问题,您只更新第一次使用文字。

这将为每个不同的 MacAddr 插入一条记录,其中 PackageId37,而 PackageId37

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
);