2017-03-03 51 views
-4

我想用1個電話返回所有的ID(工作的首位,如果沒有工作,然後回家。或空電話)如何寫一個Oracle查詢

TALBE 1

ID Name 
01  ab 
02  cd 
03  ef 

表2

ID phone type 
01 1111 work 
01 1234 Home 
02 2345 home 
+0

您期望的輸出是什麼? –

+0

到目前爲止,你有什麼嘗試?顯示一些努力會很大 – Aleksej

+0

左加入太多次 – xyray

回答

0

就像這樣......注意在子查詢中使用ROW_NUMBER()來按電話類型優先順序排列行,並使用CASE表達式來分配這些優先級。 rn也處於外連接狀態;它必須在外連接的ON子句中,並且而不是WHERE子句中(將其放在WHERE子句中將撤銷連接的字符)。

如果有人想使用它,我會包含CREATE TABLE聲明。

注 - OP在輸入中有'home''Home';這說明了爲什麼電話類型應存儲在單獨的小表中,並且table2應指向該小表,而不允許在type列中使用自由文本。

create table table1 (id, name) as 
    select 01, 'ab' from dual union all 
    select 02, 'cd' from dual union all 
    select 03, 'ef' from dual; 

create table table2 (id, phone, type) as 
    select 01, 1111, 'work' from dual union all 
    select 01, 1234, 'home' from dual union all 
    select 02, 2345, 'home' from dual; 

select t1.id, t1.name, sq.phone, sq.type 
from table1 t1 left outer join 
     (select id, phone, type, 
       row_number() over (partition by id 
        order by case type when 'work' then 0 
            when 'home' then 1 end) as rn 
     from table2 
     ) sq 
     on t1.id = sq.id and sq.rn = 1 
; 

ID NAME PHONE TYPE 
-- ---- ----- ---- 
1 ab 1111 work 
2 cd 2345 home 
3 ef  
+0

按預期工作,謝謝 – xyray

0

你可以使用左對錶2和情況下加入兩次當

select t1.id, t1.name, case when tb.phone is not null then tb.phone 
          when ta.phone is not null then ta.phone 
          else null 
         end phone 
from table1 t1 
left join table2 ta on t1.id = ta.id and ta.type = 'work' 
left join table2 tb on t1.id= tb.id and tb.type = 'Home' 
+0

這似乎效率很低 - 如果有五種電話類型,你需要加入表2的五份副本嗎?最好先處理表2。 – mathguy

+0

其實我確實有超過20種類型定義在表2中 – xyray