簡體   English   中英

使用“不存在”SQL 語句

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM