删除一个表中存在的数据而另一个表中不存在的数据?

时间:2013-04-24 07:21:54

标签: 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 
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

这是对的吗?

3 个答案:

答案 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_keya.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_serreq_year是数据类型字符串,如果它们是整数转换它们。


如何运作?

LEFT JOIN将包含位于request_fo左侧的第一个表LEFT JOIN中的不匹配行,即使没有条目满足JOIN意见,在这种情况下,对于那些不匹配的行,values_key值将为NULL

例如,请参阅this demo,第一个表中的2013 4在第二个表中不存在,因此其values_key将为NULL,因此添加{{ 3}}会给你那些在第一张表中找到而在第二张表中找不到的东西。