我有一个简单的场景,但在努力:
说我有以下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;
我尝试了左右外连接但是徒劳无功。
答案 0 :(得分: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的列将为null - 即返回默认值false
时。
似乎一个鲜为人知的事实是,连接条件可能包括非关键条件。通过在连接条件中在tabkeB上包含额外条件,左连接在返回tableA的行时仍然有效。如果留在where子句中,则不会返回任何行,因为在进行连接后,列出了,并且因为null不等于1而失败。