繁体   English   中英

Oracle 11g左联接问题

[英]Oracle 11g left join issue

尝试创建一个示例数据库,如下所示:

    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。 如果您在表app2中用静态列stato替换了静态列'E'stato,则不会发生

您外部将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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM