sql-server - SQL 删除带有子查询且不存在的行
问题描述
我有一个查询以返回具有特定状态的重复行。查询返回正确,但我还需要从 Table1 中删除行。当我将 SELECT 更改为 DELETE 语句时,它会删除所有记录,而不仅仅是基于我的查询的子集。我究竟做错了什么?这是返回预期行的查询:
SELECT *
FROM
(
SELECT *, ROW_NUMBER() over (PARTITION BY ID_1 ORDER BY Status) RowNumber
FROM Table1
) X
WHERE (((X.RowNumber > 1) and (X.Status = 1)) AND NOT EXISTS (SELECT * FROM Table2 WHERE X.ID_1 = Table2.ID_2))
现在我只想删除上面查询的结果,但是下面会删除 Table1 中的所有记录:
DELETE Table1
FROM
(
SELECT *, ROW_NUMBER() over (PARTITION BY ID_1 ORDER BY Status) RowNumber
FROM Table1
) X
WHERE (((X.RowNumber > 1) and (X.Status = 1)) AND NOT EXISTS (SELECT * FROM Table2 WHERE X.ID_1 = Table2.ID_2))
解决方案
正如Squrirrel
评论中提到的,我已经用一些虚拟数据测试了你的代码,我发现它有效。更改DELETE Table1
为DELETE X
. 这是我的示例代码,对我有用。
DECLARE @Table1 TABLE(ID_1 INT,INFO VARCHAR(20),[Status] SMALLINT);
DECLARE @Table2 TABLE(ID_2 INT,INFO VARCHAR(20),[Status] SMALLINT);
INSERT INTO @Table1 VALUES(1,'a',1);
INSERT INTO @Table1 VALUES(1,'b',1);
INSERT INTO @Table1 VALUES(1,'a',2);
INSERT INTO @Table1 VALUES(1,'b',2);
INSERT INTO @Table1 VALUES(2,'a',1);
INSERT INTO @Table1 VALUES(2,'b',1);
INSERT INTO @Table2 VALUES(2,'b',1);
DELETE X
FROM
(
SELECT *, ROW_NUMBER() over (PARTITION BY ID_1 ORDER BY Status) RowNumber
FROM @Table1
) X
WHERE (((X.RowNumber > 1) and (X.Status = 1)) AND NOT EXISTS (SELECT * FROM @Table2 t2 WHERE X.ID_1 = t2.ID_2));
推荐阅读
- java - 如何在多个文件中搜索单词并在java中显示没有重复路径的结果?
- google-cloud-firestore - 如何从 Cloud Functions 添加具有 AutoID 的 Firestore 文档?
- visual-studio - 用libvpx编译ffmpeg,找不到解码器
- docker - 在上游找不到 Nginx 主机,Docker 撰写
- python - 如何修复“列表索引超出范围”错误?
- html - Sublime Text 2 和 3 中的代码不按顺序排列
- vim - 在 vim/neovim 中创建永久折叠
- amazon-web-services - 将 MQTT 消息从 AWS Lambda 发送到我的 IOT 设备
- xcode - 我的 Flutter 应用程序拒绝在 IOS 模拟器上运行
- c# - 如何循环遍历此 C# IDictionary 以获取每个 IDictionary 条目的键和值?