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

时间:2016-12-21 17:05:12

标签: sql-server insert sql-update insert-into

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

要注意:我可以通过从第1列的数据库中提取唯一值并为每个数据库添加插入来实现此目的,但是在第1列中我有160万个唯一值,因此以这种方式编写它会很烦人。 / p>

从第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***

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

这将为每个不同的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 );

self.view.layoutIfNeeded()

答案 1 :(得分:2)

INSERTSettopSubscription新记录MacAddr每个唯一值为PackageId37MacAddr(如果有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 <ComboBox x:Name="cmbTransfer" Width="200" Height="40" BorderBrush="Transparent" BorderThickness="0" Margin="0,0,20,0" AutomationProperties.Name="Transfer State" IsTextSearchEnabled="true" FontSize="20" SelectionChanged="Transfer_Click" IsEnabled="False"/>

组合表中的记录
comboBoxItem.Content = (object)current.Attributes["uscb_language"].ToString();

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

听起来你想要这个:

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放在多个位置很容易导致数据问题,如果在将来的运行中,您只更新文字的第一次使用。