使用 NOT EXISTS 子句编写查询,而没有针对 NOT EXISTS 的子查询
Writing a query with a NOT EXISTS clause without a subquery for the NOT EXISTS
我有兴趣为需要使用 NOT EXISTS
子句检查某行是否存在的应用程序编写查询。
我正在使用 Sybase,但我想知道 SQL 中是否有一个示例,通常您可以在其中编写一个具有 NOT EXISTS
子句的查询,而没有 [=] 的嵌套子查询12=]。
所以
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 )
希望清楚。
不,如果没有子查询,就无法按照您要求的方式使用 EXISTS 函数。
您可以使用 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。
如果您没有要放入的子查询,不确定为什么需要 NOT EXISTS
,但话虽如此,这就是您要找的东西吗?
SELECT * FROM mytable WHERE NOT EXISTS (SELECT 1 WHERE 1 = 0)
子查询将 return 什么都没有,因此 NOT EXISTS 条件始终为真。
尽管这与
相同
SELECT * FROM mytable
也许您正在使用某种自动放入 NOT EXISTS
位的查询构建机制,因此您别无选择....
如果出于某种原因您不能使用 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;
我有兴趣为需要使用 NOT EXISTS
子句检查某行是否存在的应用程序编写查询。
我正在使用 Sybase,但我想知道 SQL 中是否有一个示例,通常您可以在其中编写一个具有 NOT EXISTS
子句的查询,而没有 [=] 的嵌套子查询12=]。
所以
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 )
希望清楚。
不,如果没有子查询,就无法按照您要求的方式使用 EXISTS 函数。
您可以使用 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。
如果您没有要放入的子查询,不确定为什么需要 NOT EXISTS
,但话虽如此,这就是您要找的东西吗?
SELECT * FROM mytable WHERE NOT EXISTS (SELECT 1 WHERE 1 = 0)
子查询将 return 什么都没有,因此 NOT EXISTS 条件始终为真。
尽管这与
相同SELECT * FROM mytable
也许您正在使用某种自动放入 NOT EXISTS
位的查询构建机制,因此您别无选择....
如果出于某种原因您不能使用 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;