0

我有一个简单的场景,但在苦苦挣扎:

假设我有以下 2 个表:

tableA
Acol1 Acol2 Acol3       
1       2     3 

tableB
Bcol1 Bcol2 Bcol3   
1       2    true

一个问题:

select tabB.Bcol3 from tableA tabA, tableB tabB
where
tabA.Acol1 = tabB.Bcol1
and tabB.Bcol2 = 1
and tabA.Acol1 = 1;

我希望我的查询返回“假”值,因为此查询不存在任何记录。

PS:我不能用户聚合函数,因为实际上这个场景是一个更大的查询的一部分,大约有 15 个连接和多个列。

因此,以下解决方案脱离了上下文:

   select decode(max(tabB.Bcol3), null, 'FALSE', 'TRUE') from tableA tabA, tableB tabB
    where
    tabA.Acol1 = tabB.Bcol1
    and tabB.Bcol2 = 1
    and tabA.Acol1 = 1;

我尝试了左右外连接,但徒劳无功。

4

1 回答 1

0

LEFT JOIN与 一起使用COALESCE()

select coalesce(tabB.Bcol3, false)
from tableA tabA
left join tableB tabB on tabA.Acol1 = tabB.Bcol2
    and tabB.Bcol2 = 1
where tabA.Acol1 = 1;

COALESCE()返回第一个非空值。当连接未能找到匹配项时,tableB 的列将为空——此时false将返回默认值。

连接条件可能包括非关键条件似乎是一个鲜为人知的事实。通过在连接条件中包含 tabkeB 上的额外条件,左连接在返回 tableA 的行时仍然有效。如果留在 where 子句中,则不会返回任何行,因为 where 子句在连接列出,并且会失败,因为 null 不等于 1。

于 2013-07-03T09:54:20.673 回答