2017-09-26 5 views
0

Essayez de créer un échantillon DB comme ceci:Oracle 11g jointure gauche question

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'); 

Maintenant, essayez une jointure gauche comme ceci:

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 

Le résultat est très étrange, la colonne « Stato "appartient à la table de droite, donc, dans la jointure à gauche, devrait être null si la clé de droite est nulle, donc si codice2 est nul. Pour codice = D ou E, la table de droite ne correspond pas, mais la colonne d'état n'est pas nulle. Il ne se produit pas si vous remplacez la colonne statique « E » stato avec le stato réel de la colonne dans la table APP2

+2

Montrez-nous le résultat actuel ainsi que le résultat souhaité. (Texte mis en forme s'il vous plaît.) – jarlh

+0

fait ci-dessous ..... – user5919369

Répondre

0

Vous jointure externe app2 à app. Vous sélectionnez donc tous les enregistrements de app avec toutes leurs correspondances dans app2 (comme dans une jointure interne) plus les enregistrements de app qui ne correspondent pas dans app2. Et c'est exactement ce que vous obtenez

 
CODICE1 AZIONE CODICE2 STATO 
A  OK  A  E 
B  OK  B  E 
C  OK  C  E 
E  KO  NULL  NULL 
D  KO  NULL  NULL 

Le app enregistrements A, B et C ont exactement un match chacun à app2. Les enregistrements app E et F n'en ont aucun.

Vous obtiendrez le même résultat pour

left join (select app2."CODICE", 'E' stato from app2) tt on app.codice=tt.codice 

et

left join (select app2."CODICE", app2.stato from app2) tt on app.codice=tt.codice 

et

left join app2 tt on app.codice=tt.codice 

Bien sûr, lorsque tous les enregistrements de app2 ont stato = 'E'.

+0

Oui, votre résultat il ce que je m'attends, mais ce n'est pas ce que je reçois. Mes 2 derniers enregistrements ont STATO = E. Si je supprime la déclaration de cas, j'obtiens le bon résultat. Ceci est ma version Oracle: Base de données Oracle 11g Enterprise Edition Version 11.2.0.2.0 - 64bit Production – user5919369

+0

Fonctionne bien pour moi. même version. Voir ici: http://rextester.com/WOFW4225 –

+0

Non, cela fonctionne aussi pour moi si vous retirez la colonne azione (en supprimant le cas), s'il vous plaît, essayez avec le cas comme moi ... – user5919369