SQL服务器:仅删除与 table 的所有组关联的记录
SQL Server : delete a record only if it is associated with all the groups of the table
这个问题是关于涉及两个 table 的 DELETE
查询。
我有两个 table 叫做 TableOne
和 TableTwo
。
我在 TableTwo
中的列与 TableOne
中的列相同。
CREATE TABLE TABLEONE
(
ColumnOne INT,
ColumnTwo INT
);
CREATE TABLE TABLETWO
(
ColumnOne INT,
ColumnTwo INT
);
但它们与每个 table 包含的记录数不同。
在 table 中,ColumnOne
和 ColumnTwo
都可以包含重复值。
我想根据 ColumnTwo
的值删除 TableTwo
中的一条记录。
例如,假设TableTwo
中有以下记录
ColumnOne ColumnTwo
1 200
1 300
1 400
2 200
2 100
并且TableOne
中有如下记录(包含需要删除的记录)
ColumnOne ColumnTwo
1 200
2 200
2 100
根据我的要求,只删除tableTableTwo
的ColumnTwo
中包含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)
。
这个问题是关于涉及两个 table 的 DELETE
查询。
我有两个 table 叫做 TableOne
和 TableTwo
。
我在 TableTwo
中的列与 TableOne
中的列相同。
CREATE TABLE TABLEONE
(
ColumnOne INT,
ColumnTwo INT
);
CREATE TABLE TABLETWO
(
ColumnOne INT,
ColumnTwo INT
);
但它们与每个 table 包含的记录数不同。
在 table 中,ColumnOne
和 ColumnTwo
都可以包含重复值。
我想根据 ColumnTwo
的值删除 TableTwo
中的一条记录。
例如,假设TableTwo
ColumnOne ColumnTwo
1 200
1 300
1 400
2 200
2 100
并且TableOne
中有如下记录(包含需要删除的记录)
ColumnOne ColumnTwo
1 200
2 200
2 100
根据我的要求,只删除tableTableTwo
的ColumnTwo
中包含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)
。