我想选择特定表中存在的所有行,而不存在于另一个表中以删除它们。
我编写了以下查询但是我在两个表中都存在行!!
SELECT UNIQUE b.values_key FROM request_fo a INNER JOIN rm_trans b
ON b.values_key != a.req_year || ',' || a.req_ser
AND b.taskcode = 19
AND b.values_key IS NOT NULL
AND a.req_year IS NOT NULL
AND a.req_ser IS NOT NULL
我想使用以下内容删除request_fo
中存在且rm_trans
中不存在的数据:
DELETE request_fo
FROM request_fo a
INNER JOIN
rm_trans b
ON b.values_key != a.req_year || ',' || a.req_ser
AND b.taskcode = 19
AND b.values_key IS NOT NULL
AND a.req_year IS NOT NULL
AND a.req_ser IS NOT NULL
这是对的吗?
答案 0 :(得分:5)
如果您不能使用连接语法,您还可以使用子选择。
delete from t1
where t1 = something
and not exists
(
select 1
from t2
where t1.key = t2.key
)
答案 1 :(得分:3)
当您想要执行此类操作时,您必须在集合中思考。您需要!=
或NOT IN (...)
时才会使用NOT EXISTS (...)
。
您的条款b.values_key != a.req_year || ',' || a.req_ser
正在将a
中的每一行与b
中的每一行进行比较。在大多数情况下,他们不会等同。但是,会有很多示例,其中此特定行中的values_key
与a.req_year || ',' || a.req_ser
的其他行中的a
匹配,而不是当前比较的行。这就是为什么你要获得两个表中都存在的数据。
你想尝试这样的事情:
DELETE FROM a
WHERE NOT EXISTS (SELECT 1 FROM b
WHERE b.values_key = a.req_year || ',' || a.req_ser
AND b.task_code = 19)
您还应将其作为SELECT * FROM a WHERE NOT EXISTS (...)
运行,以便先验证它。我愿意。
答案 2 :(得分:1)
以下是执行此操作的T-SQL语法:
使用LEFT JOIN
代替b.values_key IS NULL
子句中的WHERE
谓词,并使用别名a
代替DELETE
子句中的表名:
DELETE a
FROM request_fo a
LEFT JOIN rm_trans b ON b.values_key = a.req_year + ',' + a.req_ser
AND b.taskcode = 19
WHERE b.values_key IS NULL;
请在此处查看:
假设req_ser
和req_year
是数据类型字符串,如果它们是整数转换它们。
如何运作?
LEFT JOIN
将包含位于request_fo
左侧的第一个表LEFT JOIN
中的不匹配行,即使没有条目满足JOIN
意见,在这种情况下,对于那些不匹配的行,values_key
值将为NULL
。
例如,请参阅this demo,第一个表中的2013 4
在第二个表中不存在,因此其values_key
将为NULL
,因此添加{{ 3}}会给你那些在第一张表中找到而在第二张表中找不到的东西。