2017-09-26 175 views
0

尝试创建一个示例数据库是这样的:的Oracle 11g左连接问题

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 “属于右表,因此,如果右键为空,则在左连接中应该为空,因此如果codice2为null。 对于codice = D或E,右表不匹配,但是stato列不为空。 如果更换静态列“E”与表中的实际列stato stato APP 2

+2

向我们展示当前结果以及您想要的结果。 (请格式化文本。) – jarlh

+0

完成下面..... – user5919369

回答

0

你外连接app2app它不会发生。因此,您从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。记录E和F的记录app没有记录。

你会得到相同的结果为

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'

+0

是的,你的结果是我期望的,但不是我得到的。我的最后2条记录有STATO = E。如果我删除案例陈述,我会得到正确的结果。这是我的Oracle版本:Oracle数据库11g企业版版本11.2.0.2.0 - 64位生产 – user5919369

+0

适合我。相同的版本。看到这里:http://rextester.com/WOFW4225 –

+0

不,它也适用于我,如果你删除azione列(删除案件),请尝试像我这样的情况... – user5919369