sql - 相当基本的查询(可能需要子查询和/或外连接)?
问题描述
我不确定为什么我的大脑现在无法处理这个问题,但看起来这将是一个很容易编写的查询。
我有 2 张桌子:
- Orders
(pk)orderID
customername
orderDate
- OrderDetails
(pk)detailsID
orderID
productName
因此,当下一个新订单时,会在 Orders 中添加一行客户信息,并在 orderDetails 表中为订购的每个产品添加一行。
所以想象一下这两种布局:
ORDERS
orderID customerName orderDate
1 John Smith 2/21/2020
2 Bill Adams 2/21/2020
3 Susan Conrad 2/21/2020
4 Amy Fetcher 2/21/2020
ORDERDETAILS
detailsID orderID productName
1 1 pillow
2 1 mattress
3 2 pillow
4 3 sheets
5 3 headboard
6 3 mattress
7 4 pillow
8 4 framed art
9 4 decals
10 4 plant stand
在我的查询中,我想从日期 = 今天的订单中选择所有。我加入 ORDERDETAILS 表是因为我想知道任何时候我在结果中卖出了一个枕头。
我只想在结果中显示每个订单的 1 行,例如,在 orderID 1 中,他们订购了枕头和床垫。在该行的 productName 下的结果中,我希望它显示枕头。
如果有人没有订购枕头,我今天仍然需要为他们的订单显示该行,并且在 productName 下,如果它不是枕头,我不在乎它显示什么。它不能显示任何内容或他们订购的其他产品名称之一。
我知道这不起作用:
SELECT ORDERS.*, ORDERDETAILS.*
FROM ORDERS INNER JOIN ORDERDETAILS ON ORDERS.orderID = ORDERDETAILS.orderID
WHERE productName = "pillow"
我不确定我是否需要子查询或某种外部左连接可能两者兼而有之?
非常感谢任何帮助,谢谢!
解决方案
你可以这样做
select detailsID, a.orderID, productName, customerName, orderDate from
(
select detailsID, orderID, productName from ORDERDETAILS where productName = 'pillow'
union
select detailsID, orderID, productName from
(
select detailsID, orderID, productName, rank()over(partition by orderID order by detailsID) as _Rank from ORDERDETAILS
)a where _Rank = 1
and orderID not in (select orderID from ORDERDETAILS where productName = 'pillow')
) a
inner join Orders b on a.orderID = b.orderID
输出:
detailsID orderID productName customerName orderDate
1 1 pillow John Smith 2/21/2020
3 2 pillow Bill Adams 2/21/2020
4 3 sheets Susan Conrad 2/21/2020
7 4 pillow Amy Fetcher 2/21/2020
推荐阅读
- python - Selenium 在谷歌日历(Python)中找不到表单元素
- java - jsonrpc4j:java.net.SocketException:来自服务器的文件意外结束
- git - git push --mirror 自动添加不正确工作项的链接
- javascript - 我的 vuejs 动画/过渡滞后于路径更改。
- python - 连接字典列表值,同时在值之间添加“+”号
- java - 错误“包 com_atlassian_clover 不存在”
- visual-studio - Xamarin Forms 应用程序构建问题缺少 DLL
- javascript - MongoDB - Mongoose 查询 findOneAndUpdate() 不更新/复制数据库
- swift - 需要通用 FetchedResultsController 构建器(Swift)
- oauth-2.0 - Google OAuth“错误”:“invalid_grant”响应请求交换一次身份验证代码以进行刷新和访问令牌