繁体   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