2

我想选择特定表中存在且其他表中不存在的所有行来删除它们。

我编写了以下查询,但两个表中都存在行!

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

这是正确的吗 ??

4

3 回答 3

5

如果您不能使用连接语法,您也可以使用子选择。

delete from t1
where t1 = something
and not exists
(
   select 1
   from t2
   where t1.key = t2.key
)
于 2013-04-24T07:47:09.223 回答
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 (...)先运行它来验证它。我会。

于 2013-04-25T03:24:37.250 回答
1

这是执行此操作的 T-SQL 语法:

在子句中使用LEFT JOINwith b.values_key IS NULLpredicate 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那些不匹配的行。

例如,请参阅此演示2013 4第一个表中的第一个表不存在于第二个表中,因此values_key它将存在NULL,因此添加WHERE b.values_key IS NULL将为您提供在第一个表中找到但在第二个表中未找到的那些。

于 2013-04-24T07:23:20.897 回答