我有兴趣为应用程序编写查询,我需要使用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 )
希望这很清楚。
答案 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;