当连接上没有记录时返回值,oracle

时间:2013-07-03 09:50:39

标签: sql

我有一个简单的场景,但在努力:

说我有以下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;

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

P.S:我无法使用聚合函数,因为实际上这个场景是一个包含大约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;

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

1 个答案:

答案 0 :(得分:0)

LEFT JOINCOALESCE()

一起使用
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的列将为null - 即返回默认值false时。

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