数据库是 Postgres。
我有一个问题,我有一个包含以下列的表:ID、Product_ID Customer_ID、Price 和 Item_Type。
此表在 Product_ID 上连接到另一个表。对于给定的产品 ID,给定的商品类型(新品、续订、赎回等)有默认价格(其中 Customer_ID 为空白),还可能有一个客户特定的价目表(其中 Customer_ID 加入到客户表中)。
问题是该数据库维护不善。对于 Item_Type,我们对此期感兴趣的有 2 个价格:续订和续订。有些价格有续订价格,有些价格有续订价格,有些则两者兼有。
select p.id, pr.customer_id, p.period, pr.price, pr.item_type
from products p
right join prices pr on
pr.product_id = p.id and pr.period = p.period and pr.customer_id is null
where p.status = 'PURCHASED'
例如,这会产生以下内容:
121751 8407508 12 29.95 RENEW
121751 8407508 12 35.95 RENEWAL
原因是该产品有 2 个不同的续订和续订价格 - 查看前端应用程序代码 - 如果有 item_type 'RENEWAL' 则使用此价格,如果没有则使用 'RENEW' 价格。
我尝试在 select 和 where 子句中使用 case 语句:
case pr.item_type
when 'RENEWAL' then pr.price
when 'RENEW' then pr.price
end
但我仍然得到两行 - 我不确定如何进行条件和分层查找,例如,如果条件 A 匹配,则返回与条件 A 匹配的行,如果未找到匹配项,则条件 B 匹配,然后返回该行匹配条件 B 等。
左表的条件将您的 RIGHT JOIN 隐式转换为 INNER JOIN。
例如,使用类似的东西(考虑到前面的评论):
如果 RENEWAL 价格存在,那么它将被返回,如果不存在,但 RENEW 价格存在,那么你会得到它,否则你会得到 NULL(你可以将更多价格表副本与其他价格类型按需要的顺序加入)。