[英]Usage of “Not Exists” SQL statement
我有一个名为DataTable的表,其中包含 5 列: PK 、 Name、 Type、 Value、 ParentID 。
现在我需要将ParentID = 1的记录合并到ParentID = 2的记录中。因此ParentID = 1的记录将被解散,而ParentID = 2的记录表示保留。
合并规则是,如果保留的记录与已溶解的名称和类型相同,则删除已溶解。 否则将ParentID从 1 更新为 2
即我想要实现的是
update DataTable set ParentID = 2 where ParentID = 1 and
(select Name, Type from DataTable where ParentID = 1)
Not Exists
(select Name, Type from DataTable where ParentID = 2)
合并后的结果应该是
请帮助 SQL 声明。 谢谢。
正如@GordonLinoff 的评论中所指出的,这也可以通过MERGE
语句来完成。
DROP TABLE IF EXISTS dbo.t;
CREATE TABLE dbo.t(
PK int PRIMARY KEY
,Name varchar(10)
,Type varchar(10)
,Value varchar(10)
,ParentID int
,UNIQUE(Name, Type, PK)
);
INSERT INTO dbo.t VALUES
(1,'str','string','abc',1)
,(2,'b','bool','Y',1)
,(3,'b','bool','N',2)
,(4,'str','enum','abc',2);
GO
MERGE dbo.t AS target
USING (
SELECT
Name
,Type
,Value
FROM t
WHERE t.parentid = 2) AS source ON
source.Name = target.Name
AND source.Type = target.Type
AND target.ParentID = 1
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED BY SOURCE AND target.ParentID <> 2 THEN UPDATE SET ParentID = 2;
嗯。 . . 您似乎想从 parentid = 1 且相应 parentid = 2 存在的表中删除行。 您不是 100% 清楚“对应”是什么,而是这样的:
delete from t
where t.parentid = 1 and
exists (select 1
from t t2
where t2.parent_id = 2 and
t2.name = t1.name and
t2.type = t1.type
);
我懂了。 这修复了摆脱行。 然后您可以进行update
:
update t
set parentid = 2
where parentid = 1;
我应该注意,如果多个线程同时更改表,这会受到竞争条件的影响。 我确实认为merge
也会受到竞争条件的影响,所以使用merge
不会解决这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.