SQL服务器:仅删除与 table 的所有组关联的记录

SQL Server : delete a record only if it is associated with all the groups of the table

这个问题是关于涉及两个 table 的 DELETE 查询。

我有两个 table 叫做 TableOneTableTwo

我在 TableTwo 中的列与 TableOne 中的列相同。

CREATE TABLE TABLEONE
(
    ColumnOne INT,
    ColumnTwo INT
);

CREATE TABLE TABLETWO
(
    ColumnOne INT,
    ColumnTwo INT
 );

HERE IS SQLFIDDLE:

但它们与每个 table 包含的记录数不同。

在 table 中,ColumnOneColumnTwo 都可以包含重复值。

我想根据 ColumnTwo 的值删除 TableTwo 中的一条记录。

例如,假设TableTwo

中有以下记录
ColumnOne  ColumnTwo
1          200
1          300
1          400
2          200
2          100

并且TableOne中有如下记录(包含需要删除的记录)

ColumnOne  ColumnTwo
1          200
2          200
2          100

根据我的要求,只删除tableTableTwoColumnTwo中包含200的记录。

我编写了以下查询来删除 TableTwo

中的记录
DELETE FROM TableTwo
WHERE ColumnOne IN  (SELECT l.ColumnOne 
                     FROM TableOne l 
                     WHERE l.ColumnTwo = TableTwo.ColumnTwo )

此查询也删除包含 200 和 100 的记录。但我只需要删除包含 200 的记录,因为它与 TableTwo.

中的所有唯一 ColumnOne 值相关联

删除要求:TableTwo - 指定的 ColumnTwo 值必须与 ColumnOne 的所有唯一值相关联。

有人可以帮我实现这个吗?

试试 EXCEPT。通过此操作,您将从 table2 中删除匹配的行,并仅保留那些在 table1 中没有对应关联的行。所以 NOT IN 只接受那些删除的行:

DECLARE @TABLEONE TABLE
    (
      ColumnOne INT ,
      ColumnTwo INT
    );


DECLARE @TABLETWO TABLE
    (
      ColumnOne INT ,
      ColumnTwo INT
    );


INSERT  INTO @TABLEONE
VALUES  ( 1, 200 ),
        ( 2, 200 ),
        ( 2, 100 )

INSERT  INTO @TABLETWO
VALUES  ( 1, 200 ),
        ( 1, 300 ),
        ( 1, 400 ),
        ( 2, 200 ),
        ( 2, 100 )


DELETE  FROM @TABLETWO
WHERE   ColumnOne NOT IN ( SELECT   ColumnOne
                           FROM     ( SELECT    * FROM      @TABLETWO
                                      EXCEPT
                                      SELECT    * FROM      @TABLEONE
                                    ) t )
Try this one:

DELETE FROM @TABLETWO
WHERE ColumnTwo IN (SELECT ColumnTwo FROM @TABLETWO
GROUP BY ColumnTwo
HAVING COUNT(DISTINCT ColumnOne) > 1)
AND ColumnOne IN (SELECT ColumnOne FROM @TABLEONE)

TableOne 中与所有组关联的 Column2 值通过以下方式找到:

select column2
from TableOne
group by column2
having count(*) = (select count(distinct column1 from tableone));

要从 TableTwo 中删除这些值:

delete from TableTwo t2
    where t2.column2 in (select column2
                         from TableOne
                         group by column2
                         having count(*) = (select count(distinct column1 from tableone))
                        );

注意:如果可以复制整行,则 count(*) 应该是 count(distinct column1)