【发布时间】:2011-05-23 04:38:42
【问题描述】:
为此我一直在扯头发:
-- misses nulls
SELECT *
FROM BASE_TABLE TAB1
FULL JOIN BASE_TABLE TAB2
USING (ANOTHER_ID)
WHERE (TAB1.ID = 6 OR TAB1.ID IS NULL)
AND (TAB2.ID = 8 OR TAB2.ID IS NULL);
-- catches nulls
SELECT *
FROM (SELECT * FROM BASE_TABLE WHERE ID = 6) TAB1
FULL JOIN (SELECT * FROM BASE_TABLE WHERE ID = 8) TAB2
USING (ANOTHER_ID);
第一个查询会丢失一个或另一个表中的行不存在的行。为什么第一个查询做外连接失败?
我一直认为我明白了 - 首先评估 WHERE 子句,因此稍后不应用“OR IS NULL” - 但这对我来说没有意义,因为我已经成功应用了“IS NULL”过去的谓词选择连接后的行。
出于性能原因,我想让第一个查询工作 - 有人知道问题出在哪里吗?
【问题讨论】:
-
我对@987654322@ 感到困惑——那是什么语法?我在任何文档中都找不到它,普通 SQL 使用
ON TAB1.ANOTHER_ID = TAB2.ANOTHER_ID..? -
@littlegreen 自 9i 以来的 Oracle 功能。它本质上是您所写内容的简写。
-
@littlegreen, djacobson:当您使用
USING (ANOTHER_ID)时,它只会生成一个名为ANOTHER_ID的列(不能被别名引用),而ON语法会导致两列。
标签: sql oracle null predicate outer-join