Sql 连接上不存在记录时返回值,oracle

Sql 连接上不存在记录时返回值,oracle,sql,Sql,我有一个简单的场景,但仍在努力: 假设我有以下两个表: 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; 我希望

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

假设我有以下两个表:

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'值,因为此查询不存在任何记录

注意:我不能使用聚合函数,因为实际上这个场景是一个更大的查询的一部分,有大约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;

我尝试了左外连接和右外连接,但没有成功。

使用
左连接

COALESCE()
返回第一个非空值。当联接找不到匹配项时,tableB的列将为null-此时将返回默认值
false


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

Thx,但我只是在问题中重复了一个小错误:联接成功,但筛选器(where子句)上不存在记录。i、 e.Join类似于:tabA.Acol1=tabB.Bcol1Oops。我修好了。只需将rableb上的条件从wheteckause移到join子句中。Thx:它工作得很好(不确定为什么我没有尝试):)我天生喜欢(+)运算符而不是ansi表示,这样查询看起来更干净(尤其是较大的查询)。我知道人们会因为我那样说而不高兴。然而,下面的查询与您刚才给出的查询是等价的:从tabla tabA、tabab tabB中选择coalesce(tabB.Bcol3,false),其中tabA.Acol1=tabB.Bcol2(+)和tabB.Bcol2(+)=1,tabA.Acol1=1;不,不一样。老式的联接(1996年以前)本质上是一种内部联接,当在表B中找不到行时,使用它无法获得默认值。A.*左*联接是外部联接
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;