Writing A Query With A NOT EXISTS Clause Without A Subquery For The NOT EXISTS
Solution 1:
You could write an anti-join using LEFT JOIN instead of an EXISTS:
SELECT t1.*
FROM Table1 t1
LEFT JOIN Table2 t2
ON t2.Id = t1.Id
WHERE t2.Id IS NULL
But with the EXISTS operator, you must have a subquery.
Solution 2:
No, there is no way to use the EXISTS function in the way you are asking without a subquery.
Solution 3:
Not sure why you need the NOT EXISTS if you don't have a subquery to put in it, but having said that, is this what you're looking for?
SELECT * FROM mytable WHERE NOT EXISTS (SELECT 1 WHERE 1 = 0)
The subquery will return nothing so the NOT EXISTS condition is always true.
Though that's the same as
SELECT * FROM mytable
Maybe you're using some kind of query building mechanism which automatically puts in the NOT EXISTS bit so you don't have a choice....
Solution 4:
If for whatever reason you can't use a NOT EXISTS, the suggestion from Bacon Bits to rewrite as an anti-left join is correct.
In my case, the reason for avoiding NOT EXISTS was defining an Oracle materialized view with REFRESH FAST ON COMMIT. Oracle doesn't allow this if there's a subquery in the WHERE clause. However, Oracle also doesn't allow ANSI-style joins in this case (at least up to 12.2).
If you're looking to define an Oracle materialized view with REFRESH FAST ON COMMIT, you'll also need to rewrite the query to remove ANSI-style joins, thus:
select t1.*
from TABLE1 T1, TABLE2 T2
where T1.ID (+)= T2.ID
and T2.ID is null;
Post a Comment for "Writing A Query With A NOT EXISTS Clause Without A Subquery For The NOT EXISTS"