使用NOT EXISTS子句编写查询而不使用NOT EXISTS的子查询

时间:2016-05-16 13:24:06

标签: sql sybase

我有兴趣为应用程序编写查询,我需要使用NOT EXISTS子句检查是否存在行。

我正在使用Sybase,但我想知道在SQL中是否有一个示例,您可以在其中编写具有NOT EXISTS子句但没有NOT EXISTS的嵌套子查询的查询。

所以而不是

SELECT * FROM TABLE 
WHERE NOT EXISTS (SOME SUBQUERY) 

有没有一种方法可以在没有子查询的情况下编写它?

编辑:遗憾的是,我无法向您展示查询,因为它是机密信息,但我可以解释的是,我正在尝试这样做:

SELECT t1.a 
FROM (select t2.a from table t2 ,table t3 where t2.b = t3.b ) as t1
where not exists (select t1.a from table t1 ) 
希望这很清楚。

4 个答案:

答案 0 :(得分:4)

您可以使用LEFT JOIN而不是EXISTS来编写反连接:

SELECT t1.*
FROM Table1 t1
LEFT JOIN Table2 t2
    ON  t2.Id = t1.Id
WHERE t2.Id IS NULL

但是使用EXISTS运算符you must have a subquery

答案 1 :(得分:2)

不,没有子查询,就没有办法以你要求的方式使用EXISTS函数。

答案 2 :(得分:0)

如果您没有要放入子查询,不确定为什么需要NOT EXISTS,但话虽如此,这就是您要找的内容吗?

SELECT * FROM mytable WHERE NOT EXISTS (SELECT 1 WHERE 1 = 0)

子查询将不返回任何内容,因此NOT EXISTS条件始终为true。

虽然与

相同
SELECT * FROM mytable

也许你正在使用某种自动放入NOT EXISTS位的查询构建机制,所以你没有选择....

答案 3 :(得分:0)

如果由于某种原因您无法使用NOT EXISTS,Bacon Bits建议重写为反左连接是正确的。

就我而言,避免NOT EXISTS的原因是使用REFRESH FAST ON COMMIT定义Oracle物化视图。如果WHERE子句中有子查询,Oracle不允许这样做。但是,在这种情况下,Oracle也不允许ANSI样式的连接(至少高达12.2)。

如果您要使用REFRESH FAST ON COMMIT 定义Oracle实体化视图,则还需要重写查询以删除ANSI样式的连接,因此:

select t1.*
from TABLE1 T1, TABLE2 T2
where T1.ID (+)= T2.ID
and T2.ID is null;