Oracle 11g离开了加入问题

时间:2017-09-26 09:00:28

标签: sql oracle oracle11g left-join outer-join

尝试创建一个这样的示例数据库:

    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

1 个答案:

答案 0 :(得分:0)

您将app2外部加入app。因此,您选择app中的所有记录及app2中的所有匹配(如内部联接中)以及appapp2中没有匹配的记录。而这正是你得到的

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'