2016-04-07 16 views
0

Ich habe 3 Tabellen:Oracle SQL-Schleife durch Reihen

table1:

id 
111 
222 
333 
444 

table2:

id ---- flag 
111 ---- yes 
222 ---- yes 
444 ---- yes 

table3:

id ---- flag 
111 ---- no 
222 ---- yes 
333 ---- yes 

Ich möchte um eine neue Tabelle zu erstellen, die mit 'Ja' bis '1' und 'Nein' oder nicht vorhanden bis '0' gefüllt wird, aber nur solche Datensätze, die mindestens ein 'Nein' haben oder nicht vorhanden sind:

neue Tabelle:

id ------- table2flag ----------- table3flag 
111 ------- 1 ------------------- 0  
333 -------- 0 ------------------- 1 
444 -------- 1 ------------------- 0 

Beachten sie, wie es keinen Eintrag für 222 ist, da sie beide ja in beiden Tabellen sind. Wie kann ich dies mit Oracle SQL erreichen?

Antwort

1

Do LEFT JOIN 's. Verwenden Sie coalesce, um "Nein" anstelle von Null zurückzugeben.

select t1.id, coalesce(t2.flag, 'no') table2flag, coalesce(t3.flag, 'no') table3flag 
from table1 t1 
    left join table2 t2 on t1.id = t2.id 
    left join table3 t3 on t1.id = t3.id 

Edit: Zeilen überspringen mit dem gleichen ID sowohl table2 und table3 in bestehenden, beide mit flag = true, einfach diese Bedingung in einer WHERE Klausel hinzuzufügen. Verwenden Sie case 1 für ja zurück, sonst 0.

select t1.id, 
     case when t2.flag = 'yes' then 1 else 0 end as table2flag, 
     case when t3.flag = 'yes' then 1 else 0 end as table3flag 
from table1 t1 
    left join table2 t2 on t1.id = t2.id 
    left join table3 t3 on t1.id = t3.id 
where not (t2.flag = 'yes' and t3.flag = 'yes') 
+0

, die wirklich hilfreich war, aber ich habe vergessen, einige Details auf meine Anfrage hinzuzufügen. Kannst du helfen? Danke :) – waffle

+0

fast da, aber ich möchte nur überspringen, wenn die ID auf beiden Tabellen als "Ja" vorhanden ist. – waffle

0

versuchen, diese

select table1.Id, DECODE (table2.flag, 'yes',1,0) flag1 ,DECODE (table3.flag, 'yes',1,0) flag2 from table1 left join table2 
on table1.id = table2.id 
left join table3 on table1.id = table3.id 
WHERE NOT(DECODE (table2.flag, 'yes',1,0)=1 and DECODE (table3.flag, 'yes',1,0)=1) 
Verwandte Themen