将 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 是在联合中的最后计算的,除非它被包装在子查询中。
您已经知道解决方法,所以我就不提了。
在 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 是在联合中的最后计算的,除非它被包装在子查询中。
您已经知道解决方法,所以我就不提了。