sql-server - 如何只显示一个值结果(全外连接)
问题描述
表和字段信息如下。
Item ID (Column : Item ID / Desc)
=====================
Item ID Desc
0001 -------- A
0002 -------- B
0003 -------- null
Price Table (Column : Item ID / Price Level(lvl) / Price)
=========================================
Item ID Price Level Price
0001 ----------- 1 -------------3.99
0001 ----------- 2 -------------1.99
0002 ----------- 1 -------------2.99
0003 ----------- 1 -------------5.99
0003 ----------- 2 -------------3.99
(默认价格等级为“1”)因此,每个商品的价格等级为 1,某些商品的价格等级为 1 和 2
我使用完整的外连接“项目”和“价格”表。
select trs_itm.id, item.desc, price.lvl, price.price from trs_itm
full outer join item on trs_itm.id = item.id
full outer join price on price.id = item.id
group by trs_itm.id, item.desc, price.lvl, price.price
如何显示查询结果如下。
如果某个项目的价格级别为“2”,则只显示结果价格级别 2。但该项目没有价格级别“2”,则仅显示默认价格级别 1。
请帮我。
==============================================
ID Desc lvl price
0001 ------ A ---- 2 -------1.99
0002 ------ B ---- 1 -------2.99
0003 -----null --- 2 -------3.99
解决方案
在这种情况下,我不知道您为什么要进行完全外部联接。
加入 2 个表和返回每个项目的最高价格水平的查询:
select i.*, p.pricelevel, p.price
from item i
inner join price p on p.itemid = i.itemid
inner join (
select itemid, max(pricelevel) pricelevel
from price
group by itemid
) g on g.itemid = p.itemid and g.pricelevel = p.pricelevel
order by i.itemid
或与not exists
:
select i.*, p.pricelevel, p.price
from item i inner join (
select p.* from price p
where not exists (
select 1 from price
where itemid = p.itemid and pricelevel > p.pricelevel
)
) p on p.itemid = i.itemid
order by i.itemid
请参阅演示。
结果:
> itemid | desc | pricelevel | price
> -----: | :--- | ---------: | ----:
> 1 | A | 2 | 1.99
> 2 | B | 1 | 2.99
> 3 | null | 2 | 3.99
推荐阅读
- c - 如何更改我的程序以结束连续打印的错误响应?
- kubernetes - 如何检查每个节点的 pod
- reactjs - 如何通过钩子编写 onChange 事件?
- kubernetes - HorizontalPodAutoscaler Kubernetes 不保留最小副本数
- javascript - 运行跨环境 NODE_ENV=development webpack-dev-server --open --hot 时无法在 vue js 中使用 .env 文件
- java - Jsoup web scrape 给了我 java.lang.NoClassDefFoundError 指向我声明文档的行,我不知道为什么?
- html - CSS不会链接到HTML,尝试了一切
- windows - 如何在 x86_64 程序集中 printf 和 scanf?
- c++ - 订购独立的可变参数模板参数
- java - 如何点击 Selenium Webdriver 和 Java