[英]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.