2017-02-27 93 views
1

SQL Server 2014中,我使用Northwind作为示例数据库,并使用Orders表。使用Top with Union全部

选择第一行:

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 

但我仍然感到困惑,为什么我应该,但第二选择成派生表!

+1

它们不同,因为您在第一个查询中没有使用“ORDER BY”。如果没有'ORDER BY',那么每次'TOP 1'的结果都不能保证一致。如果你想获得第一个结果,你需要做一个'ORDER BY orderID ASC'。 – Siyual

+0

@Siyual,它不起作用,如果我在第一个查询中使用了“Order by OrderID ASC”,我得到:'关键字'union'附近的语法错误。 ' –

回答

3

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 

,因为是在最后的联合评估,除非它被包裹的子查询中的顺序。

您已经知道解决方法,所以我没有提及它。

+0

感谢您的回答,这是我的预期,最后一点是它的记录? –