尝试创建一个这样的示例数据库:
CREATE TABLE "APP"
( "CODICE" VARCHAR2(20 BYTE)
);
Insert into APP (CODICE) values ('A');
Insert into APP (CODICE) values ('B');
Insert into APP (CODICE) values ('C');
Insert into APP (CODICE) values ('D');
Insert into APP (CODICE) values ('E');
CREATE TABLE "APP2"
( "CODICE" CHAR(1 BYTE),
"STATO" VARCHAR2(20 BYTE)
);
Insert into APP2 (CODICE,STATO) values ('A','E');
Insert into APP2 (CODICE,STATO) values ('B','E');
Insert into APP2 (CODICE,STATO) values ('C','E');
现在,尝试这样的左连接:
select app.codice codice1,
case
when app.codice in ('A','B','C') then 'OK'
when app.codice in ('D','E') then 'KO'
end azione,
tt.codice codice2,
tt.stato
from app left join (select app2."CODICE", 'E' stato
from app2) tt on app.codice=tt.codice
结果非常奇怪,专栏" stato"属于右表,因此,如果右键为null,则在左连接中应为null,因此如果codice2为null。 对于codice = D或E,右表不匹配,但stato列不为null。 如果更换静电柱,则不会发生这种情况。 stato与表app2中的真实列stato
答案 0 :(得分:0)
您将app2
外部加入app
。因此,您选择app
中的所有记录及app2
中的所有匹配(如内部联接中)以及app
中app2
中没有匹配的记录。而这正是你得到的
CODICE1 AZIONE CODICE2 STATO A OK A E B OK B E C OK C E E KO NULL NULL D KO NULL NULL
app
记录A,B和C在app2
中只有一个匹配。 app
记录E和F没有。
你会得到相同的结果
left join (select app2."CODICE", 'E' stato from app2) tt on app.codice=tt.codice
和
left join (select app2."CODICE", app2.stato from app2) tt on app.codice=tt.codice
和
left join app2 tt on app.codice=tt.codice
当然app2
中的所有记录都有stato = 'E'
。