【发布时间】:2021-09-15 06:23:51
【问题描述】:
我正在编写一个 SQL 查询来从 3 个以上的表中获取数据,但为了简化这里的问题,我使用了 3 个表的类似场景。
Table1 客户(PK-CustomerID,姓名)
| CustomerID | Name |
|---|---|
| 1 | John |
| 2 | Tina |
| 3 | Sam |
Table2 销售额(FK-Id、SalePrice)
| ID | SalePrice |
|---|---|
| 1 | 200.00 |
| 2 | 300.00 |
| 3 | 400.00 |
Table3 订单(PK-Id、FK-CustomerID、日期、金额)
| Id | CustomerID | Date | Amount |
|---|---|---|---|
| 101 | 1 | 25-09-2021 | 30.0 |
| 102 | 1 | 27-09-2021 | 40.0 |
| 103 | 2 | 19-09-2021 | 60.0 |
在输出中,日期和金额应该是客户最近的订单(最新日期)
我的方法是
Select c.CustomerID, c.Name, s.SalePrice, RecentOrder.Date, RecentOrder.Amount from
Customer as c
LEFT JOIN Sales s ON c.CustomerID = s.ID
LEFT JOIN (SELECT top 1 o.Date, o.Amount, o.CustomerID
FROM Order o, Customer c1 WHERE c1.CustomerID = o.CustomerID ORDER BY o.Date DESC)
RecentOrder ON c.CustomerID = RecentOrder.CustomerID
我得到的输出
客户 ID、姓名、销售价格、日期、金额
| CustomerID | Name | SalePrice | Date | Amount |
|---|---|---|---|---|
| 1 | John | 200.00 | 27-09-2021 | 40.0 |
| 2 | Tina | 300.00 | null | null |
| 3 | Sam | 400.00 | null | null |
我得到的输出包括所有订单中的最新订单。但我想从该客户的订单中获取最近的订单
需要输出
客户 ID、姓名、销售价格、日期、金额
| CustomerID | Name | SalePrice | Date | Amount |
|---|---|---|---|---|
| 1 | John | 200.00 | 27-09-2021 | 40.0 |
| 2 | Tina | 300.00 | 19-09-2021 | 60.0 |
| 3 | Sam | 400.00 | null | null |
【问题讨论】:
-
可能是时候抛弃这种 30 年前已弃用的语法了!您的查询还应该产生一个名为
order的表的错误 - 它应该是[order]- 但是通过调用它是完全可以避免的orders- 大概它包含多个订单? -
有些人喜欢给对象名称“单例”名称,@Stu,所以问题实际上是它是一个保留关键字。如果 OP 想要一个单例名称,也许
CustomerOrder会是更好的选择。
标签: sql sql-server tsql left-join sql-order-by