Sql 是否删除一个表中存在而另一个表中不存在的数据?
我想选择在特定表中存在而在另一个表中不存在的所有行来删除它们 我编写了以下查询,但我发现两个表中都存在行Sql 是否删除一个表中存在而另一个表中不存在的数据?,sql,tsql,informix,Sql,Tsql,Informix,我想选择在特定表中存在而在另一个表中不存在的所有行来删除它们 我编写了以下查询,但我发现两个表中都存在行 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
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\u fo
中存在的数据和rm\u 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
这是正确的吗?下面是T-SQL语法:
在WHERE
子句中使用LEFT JOIN
代替b。values\u键为NULL
谓词,在DELETE
子句中使用别名a
代替表名:
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\u ser
和req\u year
是数据类型字符串,如果它们是整数,则将它们转换为整数
它是如何工作的?
LEFT JOIN
将包括第一个表request\u fo
中不匹配的行,该表位于LEFT JOIN
的左侧,即使没有满足JOIN
条件的条目,在这种情况下,对于那些不匹配的行,value键
值将为NULL
例如,请参阅,第一个表中的2013 4
在第二个表中不存在,因此它的值\u键将为NULL
,因此添加将为您提供在第一个表中找到而在第二个表中找不到的值。如果您不能使用连接语法,也可以使用子选择
delete from t1
where t1 = something
and not exists
(
select 1
from t2
where t1.key = t2.key
)
当你想执行这种操作时,你必须集中思考。您正在使用=代码>当您需要不在(…)
或不存在(…)
时
你的子句b.values\u key!=a、 req|year | | a.req|ser
正在将a
中的每一行与b
中的每一行进行比较。在大多数情况下,它们并不相等。但是,在许多例子中,这一行中的值_键
与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*从不存在的位置(…)
运行它,以首先验证它。我会的。为什么设置b.values\u键为空?!不同的数据库管理系统对删除操作有不同的语法,尤其是带连接的删除操作。您不能自动期望在MS SQL Server中工作的东西在Oracle、DB2、Informix、MySQL、PostgreSQL中工作-它通常在Sybase中工作,但不一定在Sybase中工作。@JonathanLeffler:那么,从请求中删除a的语法是什么,'+a.req_ser和b.taskcode=19,其中b.values_key为空