在同一张桌子上“加入” 2个不同的选择?

时间:2019-04-04 22:58:22

标签: sql sql-server

我有一个产品订单表,每个产品都有自己的发货日期。如何检索订单,以显示最快的发货日期?

例如:

Order  Product  Ship date
1      phone    02/03/2019
1      charger  02/07/2019
2      printer  03/01/2019

检索以下内容的SQL查询是什么?

Order  Product  Ship date
1      phone    02/03/2019
1      charger  02/03/2019
2      printer  03/01/2019

即订单1上的所有发货日期均为最早日期,均为02/03/2019。

我尝试过:

SELECT order, 
       product,
       (SELECT ship_date FROM Tracking ORDER BY ship_date ASC) tbl ON tbl.order = t.order
FROM Tracking t

但是我得到了错误:

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.

4 个答案:

答案 0 :(得分:1)

要摆脱“除非在视图,内联函数,派生表,子查询和公共表表达式中使用ORDER BY子句,除非也指定了TOP或FOR XML,否则该子句无效。”消息,您可以通过在子查询中添加“ SELECT TOP 100 PERCENT”来实现。 但我建议您研究一下RANK和DENSE_RANK函数,因为它们可能会更有帮助

答案 1 :(得分:1)

考虑到错误消息,我认为这是针对SQL Server的,因此可以使用窗口功能。

您可以使用min()的窗口版本来获取订单的最小发货日期。

SELECT [order],
       [product],
       min([ship date]) OVER (PARTITION BY [order]) [ship date]
       FROM tracking;           

答案 2 :(得分:0)

我不确定我是否理解您在这里想要实现的目标。好吧,如果您只想查询按发货日期排序的表,我认为类似的方法会起作用:

SELECT * FROM Tracking ORDER BY ship_date ASC; 

答案 3 :(得分:0)

您正在使其变得非常复杂。查询非常简单:

select * from my_table group by shipdate order by shipdate asc