将 Top 与 Union all 结合使用

Using Top with Union all

SQL Server 2014 中,我使用 Northwind 作为示例数据库,并且 Orders table.

选择第一行:

select top 1 orderID, CustomerID,EmployeeID,OrderDate,RequiredDate 
from orders

输出:

orderID CustomerID  EmployeeID  OrderDate   RequiredDate
10248   VINET   5   1996-07-04 00:00:00.000 1996-08-01 00:00:00.000

选择最后一行:

select top 1 orderID, CustomerID,EmployeeID,OrderDate,RequiredDate 
from orders order by orderID desc

输出:

orderID CustomerID  EmployeeID  OrderDate   RequiredDate
11077   RATTC   1   1998-05-06 00:00:00.000 1998-06-03 00:00:00.000

让我们通过使用 Union ALL:

合并第一行和最后一行
select top 1 orderID, CustomerID,EmployeeID,OrderDate,RequiredDate 
from orders
union all
select top 1 orderID, CustomerID,EmployeeID,OrderDate,RequiredDate 
from orders order by orderID desc

输出:

orderID CustomerID  EmployeeID  OrderDate   RequiredDate
10248   VINET   5   1996-07-04 00:00:00.000 1996-08-01 00:00:00.000
10248   VINET   5   1996-07-04 00:00:00.000 1996-08-01 00:00:00.000

所以为什么最后的结果没有按预期显示数据。

我知道获取第一行和最后一行,使用下一行:-

select top 1 orderID, CustomerID,EmployeeID,OrderDate,RequiredDate 
from orders
union all
Select * from
(
select top 1 orderID, CustomerID,EmployeeID,OrderDate,RequiredDate 
from orders order by orderID desc ) a

输出:-

orderID CustomerID  EmployeeID  OrderDate   RequiredDate
10248   VINET   5   1996-07-04 00:00:00.000 1996-08-01 00:00:00.000
11077   RATTC   1   1998-05-06 00:00:00.000 1998-06-03 00:00:00.000

但我仍然很困惑为什么我应该将第二个 select 转换为派生的 table !

这个

select top 1 orderID, CustomerID,EmployeeID,OrderDate,RequiredDate 
from orders
union all
select top 1 orderID, CustomerID,EmployeeID,OrderDate,RequiredDate 
from orders order by orderID desc

实际工作为:

(select top 1 orderID, CustomerID,EmployeeID,OrderDate,RequiredDate 
from orders
union all
select top 1 orderID, CustomerID,EmployeeID,OrderDate,RequiredDate 
from orders) order by orderID desc

因为 order by 是在联合中的最后计算的,除非它被包装在子查询中。

您已经知道解决方法,所以我就不提了。