Sql server SQL Server:为第1列中的每个唯一值插入新行
使用SQL Server,我试图在表的第1列中查找每个唯一的值,然后使用该唯一的第1列值插入新行,并添加第2列值。第2列的值每次都相同 注意:我可以通过从第1列的数据库中取出唯一值并为每个值添加一个insert来做到这一点,但是第1列中有160万个唯一值,所以这样写会很累人 以第1列中的2个唯一值为例:Sql server SQL Server:为第1列中的每个唯一值插入新行,sql-server,insert,sql-update,insert-into,Sql Server,Insert,Sql Update,Insert Into,使用SQL Server,我试图在表的第1列中查找每个唯一的值,然后使用该唯一的第1列值插入新行,并添加第2列值。第2列的值每次都相同 注意:我可以通过从第1列的数据库中取出唯一值并为每个值添加一个insert来做到这一点,但是第1列中有160万个唯一值,所以这样写会很累人 以第1列中的2个唯一值为例: select * from dbo.SettopSubscription where MacAddr = '0000000ee4b5' or MacAddr = '0000003a9667
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
对于
MacAddr
的每个唯一值,在SettopSubscription
表中插入一条新记录,其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
听起来你想要这个:
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
插入一条记录,其中的PackageId
为37
,而该记录不包含alr已经有了37的PackageId
:
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
);
现在我想把PackageId=37添加到每个唯一的MacAddr中,你想让它成为过滤器的一部分还是什么?因此,为了澄清,你想从table1
中选择distinctcolumn1
,然后将该值插入table1
中,并在column2
中使用不同的值?还是希望从column1
中选择相应的值到目前为止只发生一次,并将那些值插入到表1
中列2
?不确定您所说的过滤器是什么意思,我对mssql比较新,但在其他脚本中,我很可能会将唯一的MacAddr值添加到列表中,然后运行for或if语句,为该列表中MacAddr的每个值添加新行。是否可行mssql中的le?因此,当您在第1列中发现一个唯一的值时,您想更新该值的第2列,或者您想插入一行,其中包含该值和第2列的值?为我们提供一个表的初始外观示例,以及一个您希望它在末尾显示的数据示例,这可能会有一些帮助。这将清除所有配置usion。这看起来与他要求的非常接近,但我想我会在那里设置一个条件,排除任何已经有PackageId
为37
的MacAddr
——至少根据评论中的确认。按预期工作,谢谢!尝试其他选项以停止编写du的可能性折叠行。如果PackageId=37已经在表中,有人有一个解决方案可以添加到表中,从而消除添加新行的情况吗?@Tim看到我的答案,如果3N1GM4很快更新他的,我将删除我的。是的,这也会起作用。如果OP想接受你的答案,因为你大部分时间都是先得到它的,我很好。会投票给你的eit吗她的方式。=)服务器:Msg 170,15级,状态1,第3行,第3行:“,”附近的语法不正确。哇。谢谢。这将运行,但不会将新值添加到表中。这将按预期工作,并添加在PackageId='x'已存在时不写入重复行的附加内容。