基于指定键查询记录(无则返回NULL):产品价格优先级查询
解决专属定价优先匹配的SQL查询方案
这是个非常典型的「优先级匹配」查询场景,我直接给你两种实用的实现方式,根据你的使用场景选就行:
方式一:批量获取所有产品的最优定价(推荐用于多产品场景)
用窗口函数ROW_NUMBER()给每个产品的定价记录排序,优先保留目标公司的专属定价,没有的话就用通用定价:
-- 定义目标公司ID参数,替换成你实际的参数值或变量 DECLARE @TargetCompanyId INT = 977; WITH RankedPrices AS ( SELECT Id, ProductId, Price, CompanyId, -- 排序规则:匹配目标CompanyId的记录排第一,通用定价排第二 ROW_NUMBER() OVER ( PARTITION BY ProductId ORDER BY CASE WHEN CompanyId = @TargetCompanyId THEN 0 ELSE 1 END ) AS PriceRank FROM ProductPrice -- 只筛选目标公司的专属定价和通用定价 WHERE CompanyId = @TargetCompanyId OR CompanyId IS NULL ) -- 取每个产品的第一优先级记录 SELECT Id, ProductId, Price, CompanyId FROM RankedPrices WHERE PriceRank = 1;
逻辑说明:
- 用CTE
RankedPrices给每个ProductId分组,然后根据是否匹配目标CompanyId排序:匹配的记录会被标记为PriceRank=1,通用定价(CompanyId IS NULL)标记为PriceRank=2 - 最后筛选
PriceRank=1的记录,就是每个产品的最优定价
示例验证:
当@TargetCompanyId=977时,返回结果如下:
| Id | ProductId | Price | CompanyId |
|---|---|---|---|
| 1 | 10 | 100 | NULL |
| 2 | 20 | 300 | NULL |
| 4 | 25 | 400 | 977 |
完全符合需求:ProductId=25取专属定价,其他产品取通用定价。
方式二:单产品的最优定价查询(适合单个产品场景)
如果只需要查询某一个产品的最优定价,可以用更简洁的TOP 1+排序的方式:
DECLARE @TargetCompanyId INT = 977; DECLARE @TargetProductId INT = 25; SELECT TOP 1 Id, ProductId, Price, CompanyId FROM ProductPrice WHERE ProductId = @TargetProductId AND (CompanyId = @TargetCompanyId OR CompanyId IS NULL) -- 优先返回目标公司的专属定价 ORDER BY CASE WHEN CompanyId = @TargetCompanyId THEN 0 ELSE 1 END;
这个语句会直接返回匹配目标产品的优先级最高的定价记录,逻辑和方式一一致,只是更轻量化。
内容的提问来源于stack exchange,提问作者deblendewim
相关产品推荐
相关产品推荐

