我想用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
我想用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
就像這樣......注意在子查詢中使用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
按預期工作,謝謝 – xyray
你可以使用左對錶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'
您期望的輸出是什麼? –
到目前爲止,你有什麼嘗試?顯示一些努力會很大 – Aleksej
左加入太多次 – xyray