2016-04-07 15 views
0

У меня есть 3 таблицы:Oracle SQL Перебор строк

table1:

id 
111 
222 
333 
444 

table2:

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

table3:

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

хочу для создания новой таблицы, которая заполняется «да» до «1» и «нет» или не существует в «0», но только те записи, которые имеют по крайней мере одно «нет» или вообще не существует:

новая таблица:

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

Обратите внимание, как нет записи для 222, так как они оба да в обеих таблицах. Как я могу достичь этого с помощью Oracle sql?

ответ

1

Do LEFT JOIN. Используйте coalesce, чтобы вернуть 'no' вместо null.

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: Пропуск строк с существующими же идентификатор в обоих table2 и Table3, как с флагом = верно, просто добавить, что условие в предложении WHERE. Используйте case для возврата 1 для да, в противном случае 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

, что было очень полезно, но я забыл добавить некоторые детали к моей просьбе. вы можете помочь? спасибо :) – waffle

+0

почти там, но я хочу только пропустить, если id присутствует на обеих таблицах как «да». – waffle

0

попробовать этот

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) 
Смежные вопросы