项目价格将从多个价格表中检索。每个项目的价格可能不是在所有的桌子上。查询序列是基于表优先级的。查询将在价格可用时停止。
例如:价格表有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中。
发布于 2016-05-20 22:09:32
; 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
发布于 2016-05-20 22:02:15
也许是这样的?
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
发布于 2016-05-20 22:03:20
不创建表(临时表或其他表):
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
我认为这是一个有趣的问题,我知道这可以在一个查询中完成。其他的答案也很棒!只是调味一下
https://stackoverflow.com/questions/37359249
复制