首页 > 解决方案 > 相当基本的查询(可能需要子查询和/或外连接)?

问题描述

我不确定为什么我的大脑现在无法处理这个问题,但看起来这将是一个很容易编写的查询。

我有 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"

我不确定我是否需要子查询或某种外部左连接可能两者兼而有之?

非常感谢任何帮助,谢谢!

标签: sqlvbscript

解决方案


你可以这样做

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

推荐阅读