2016-05-21 62 views
0

將從多個價格表中檢索項目價格。每個項目的價格可能不在所有表格上。查詢序列基於表優先級。價格可用時查詢將停止。按順序查詢多個表格中的數據

例如:價格表有T1,T2和T3以及表查詢順序,優先級爲T1,T2和T3。

T1表記錄

Item, Price 
I1, $11 
I3, $13 
I4, $14 

T2表記錄

Item, Price 
I2, $21 
I3, $23 
I5, $25 

T3表記錄

Item, Price 
I1, $31 
I2, $32 
I6, $33 

結果:

Item I1 is $11, I3 is $13, 
and I4 is $14. 

它將從作爲第一優先級表的T1中檢索。由於價格在T1中可用,因此不會搜索T2和T3。

項目I2和I5將來自表格T2。
它們在第一優先級表T1中不可用並且查詢移動到第二優先級表T2。

項目I6將來自T3。
由於I6不在T1和T2中。

回答

1
; with item as 
(
    select item from T1 
    union 
    select item from T2 
    union 
    select item from T3 
) 
select item = i.item, 
      value = coalesce(v1.value, v2.value, v3.value) 
from  item i 
left join T1 v1 on i.item = v1.item 
left join T2 v2 on i.item = v2.item 
left join T3 v3 on i.item = v3.item 
+0

偉大的解決方案和感謝。 – YellowLarry

1

也許這樣?

create table #item1(
    item int, 
    value int 
) 

insert into #item1 values 
(1,1), 
(2,2) 

create table #item2(
    item int, 
    value int 
) 

insert into #item2 values 
(1,10), 
(2,20), 
(3,30) 

create table #item3(
    item int, 
    value int 
) 

insert into #item3 values 
(1,100), 
(2,200), 
(3,300), 
(4,400) 

;with cte as (
    select *, t=1 from #item1 
    union all 
    select *, t=2 from #item2 
    union all 
    select *, t=3 from #item3 
), 
cte1 as (
    select 
     *, 
     rn = row_number() over (partition by item order by t) 
    from 
     cte 
) 
select 
    item, value 
from 
    cte1 
where 
    rn = 1 


drop table #item1 
drop table #item2 
drop table #item3 
+0

結果是正確的。謝謝, – YellowLarry

1

確定,而無需創建表(臨時或以其他方式):

select 
M.item --Select unique item from Master list 
,coalesce(
    (select price from T1 where T1.item = M.item), 
    (select price from T2 where T2.item = M.item), 
    (select price from T3 where T3.item = M.item) 
) --Cascade of prices per table 
from 
    (select * from T1 
    union 
    select * from T2 
    union 
    select * from T3) M --Creating Master list of items and prices 
group by item --ensuring that we only pull unique items 

我認爲這是一個有趣的問題,並知道它可以在一個查詢來完成。其他答案也很棒!只是將它們加起來

+0

不錯的嘗試。儘管select子句中的子查詢不是性能的好主意。檢查你的執行計劃。 ;-) P.S.在coalesce之前移除''''。 – shadow

+0

結果正是我需要的。附: ','在SQL Server 2014'coalesce'之前是必需的。 – YellowLarry

+0

@YellowLarry原始代碼是'select M.item ,, coalesce' – shadow