我的产品有价格,有时公司的产品价格更具特色。
我想知道我是否可以对此进行一个很好的查询?
很简单的例子:
表ProductPrice:
Id | ProductId | Price | CompanyId
===|===========|=======|===========
1 | 10 | 100 | NULL
2 | 20 | 300 | NULL
3 | 25 | 500 | NULL
4 | 25 | 400 | 977
现在我想选择始终使用companyId作为参数,但结果应返回最具体的记录。
所以我想在我的ProductPrice表中查询companyId = 977,因此我想要:
1 | 10 | 100 | NULL
2 | 20 | 300 | NULL
4 | 25 | 400 | 977
任何可以告诉我这个小组如何运作的人?
谢谢!
答案 0 :(得分:1)
嗯。您想要的是优先级查询。这是一种方式:
select pp.*
from productprice pp
where pp.company = 977
union all
select pp.*
from productprice pp
where pp.company is null and
not exists (select 1 from productprice where pp2.productid = pp.productid and pp2.company = 977);
这适用于(两个)优先级。更通用的方法是使用row_number()
:
select pp.*
from (select pp.*,
row_number() over (partition by productid
order by case company 977 then 1 else 2 end
) as seqnum
from productprice pp
) pp
where seqnum = 1;
第三种选择假设您有products
表(合理)。在这种情况下:
select pp.*
from product p cross apply
(select top 1 pp.*
from productprice pp
where pp.productid = p.productid
order by (case companyid when 977 then 1 else 2 end)
) pp;