SQL不存在的地方

Kai*_*ran 1 sql oracle not-exists where-clause oracle11g

我想我对NOT EXISTS的工作方式有误解,希望能够澄清一下.

这是我正在运行的示例代码(也在SQL Fiddle上)

select sum(col1) col1, sum(col2) col1, sum(col3) col3
from (
  select 1 col1, 1 col2, 1 col3
  from dual tbl1
  )
where not exists(
  select 2 col1, 1 col2, 1 col3
  from dual tbl2
)
Run Code Online (Sandbox Code Playgroud)

我认为它应该返回:

1, 1, 1
Run Code Online (Sandbox Code Playgroud)

但它没有返回任何东西.

我做这个假设只是因为我虽然不是EXISTS会给我一个第一个查询中第二个查询中不存在的所有行的列表(在本例中为1,1,1)

  1. 为什么这不起作用
  2. 什么是使它按照我期望的方式工作的适当方法?

Joh*_*ger 5

您正在执行不相关的子查询NOT EXISTS().它总是返回一行,因此NOT EXISTS永远不会满足条件,并且查询返回零行.

Oracle有一个行集差异运算符,MINUS它应该做你想要的:

select sum(col1) col1, sum(col2) col1, sum(col3) col3
from (
  select 1 col1, 1 col2, 1 col3
  from dual tbl1

  MINUS

  select 2 col1, 1 col2, 1 col3
  from dual tbl2
)
Run Code Online (Sandbox Code Playgroud)

SQL Server有一个EXCEPT与Oracle相同的运算符MINUS.其他一些数据库实现其中一个或另一个.