【问题标题】:How do you delete rows that match in two separate tables using SQL?如何使用 SQL 删除两个单独表中匹配的行?
【发布时间】:2017-09-15 00:33:13
【问题描述】:

在使用 SQL Server Management Studio 进行 SQL 编码时,我可以在插入或删除时从具有不同行数的表中删除。在我更新表 A 之后,我想从表 A 中删除匹配项,如果它们在表 B 中。这个想法是最终只得到表 A 中已更新的行。我有 10 列,但将使用 4 到把事情简单化。

CREATE TRIGGER utr_Updates
ON  tableA
AFTER UPDATE
AS BEGIN
    SET NOCOUNT ON;
    EXEC usp_updates
END

CREATE PROCEDURE usp_Updates
AS
BEGIN
    IF EXISTS (SELECT * FROM tableA 
               WHERE col1 IN (SELECT DISTINCT col1 FROM tableB))
        DELETE FROM tableA 
        WHERE col1 IN (SELECT DISTINCT col1 FROM tableB)

    IF EXISTS (SELECT * FROM tableA 
               WHERE col2 IN (SELECT DISTINCT col2 FROM tableB))
        DELETE FROM tableA 
        WHERE col2 IN (SELECT DISTINCT col2 FROM tableB)

    IF EXISTS (SELECT * FROM tableA 
               WHERE col3 IN (SELECT DISTINCT col3 FROM tableB))
        DELETE FROM tableA 
        WHERE col3 IN (SELECT DISTINCT col3 FROM tableB)

    IF EXISTS (SELECT * FROM tableA 
               WHERE col4 IN (SELECT DISTINCT col4 FROM tableB))
        DELETE FROM tableA 
        WHERE col4 IN (SELECT DISTINCT col4 FROM tableB)
END

起点

                  START

    TABLE A                TABLE B
col1 W, X, Y, Z         col1 W, X, Y, Z
col2 1, 2, 3, 4         col2 1, 2, 3, 4
col3 A, 5, 6, D         col3 A, 5, 6, D
col4 7, B, C, D         col3 7, B, C, D

表 A 在 col1 和 col3 更新

               AFTER UPDATE

    TABLE A                TABLE B
col1 W, S, Y, Z         col1 W, X, Y, Z
col2 1, 2, 3, 4         col2 1, 2, 3, 4
col3 A, 5, 1, D         col3 A, 5, 6, D
col4 7, B, C, D         col3 7, B, C, D

期望的结果

     TABLE A   
 col1 W, S, Y, Z
 col3 A, 5, 1, D

【问题讨论】:

    标签: sql-server database ssms


    【解决方案1】:

    你可以使用NOT EXISTS:

    select a.*
    from a
    where not exists (select 1
                      from b
                      where b.col1 = a.col1 and b.col2 = a.col2 and b.col3 = a.col3 and b.col4 = a.col4
                     );
    

    或者,在 SQL Server 中,您可以使用EXCEPT

    select a.*
    from a
    except
    select b.*
    from b;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2018-12-18
      • 2014-11-15
      • 2021-02-23
      相关资源
      最近更新 更多