2011-04-05 6 views
32

테이블의 첫 번째 레코드와 테이블의 마지막 레코드를 하나의 결과 집합에 가져 오려면 어떻게합니까?SQL Server에서 ORDER BY와 UNION 결합

이 쿼리는

SELECT TOP 1 Id,Name FROM Locations ORDER BY Id 
UNION ALL 
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id DESC 

어떤 도움을 실패?

답변

52

하위 쿼리로 order bytop 문을 넣어 :

select first.Id, first.Name 
from (
    select top 1 * 
    from Locations 
    order by Id) first 
union all 
select last.Id, last.Name 
from (
    select top 1 * 
    from Locations 
    order by Id desc) last 
+0

키스 I SQL Server 2005를 사용하고 내가 할 때 제안으로 내가 얻을 다음과 같은 오류, ORDER BY 절은 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 표현식에서 유효하지 않습니다, TOP 또는 FOR XML도 지정되지 않은 경우 i는 다음 시도 때 , 는 '* ( \t SELECT * CTEWithNDCNotNull NDC의 ASC BY ORDER FROM) NDCNotNull UNION AS SELECT * FROM FROM NDCNull AS ( \t SELECT * GPI의 ASC BY CTEWithNDCNull의 주문)을 선택 ' 어떻게 수정합니까? –

+1

@peplamb 서브 쿼리'select' 다음에'top'을 지정해야합니다. 원하는 행 수를 지정하지 않고'union '을 정렬 할 수 없습니다. – Keith

7
select * from (
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id) X 
UNION ALL 
SELECT TOP 1 Id,Name FROM Locations ORDER BY Id DESC 
8

을 나중에 SQL Server 2005 또는에서 작업하는 경우 :

; WITH NumberedRows as (
    SELECT Id,Name, 
     ROW_NUMBER() OVER (ORDER BY Id) as rnAsc, 
     ROW_NUMBER() OVER (ORDER BY Id desc) as rnDesc 
    FROM 
     Locations 
) 
select * from NumberedRows where rnAsc = 1 or rnDesc = 1 

유일한 곳이 원 ' 테이블에 단 하나의 행만있는 경우 원래 쿼리와 같아야합니다 (이 경우 내 대답은 한 행을 반환하지만 사용자의 행은 두 번 동일한 행을 반환합니다)

+0

좋은 대체 대답이지만, 'union all'을 'union'으로 대체하면 내 행 하나를 반환 할 수도 있습니다. 쿼리 분석기에서 비교할 가치가 있습니다. – Keith

0
SELECT TOP 1 Id as sameColumn,Name FROM Locations 
UNION ALL 
SELECT TOP 1 Id as sameColumn,Name FROM Locations ORDER BY sameColumn DESC 
+2

기존 답변과 다른 점은 무엇입니까? – TheGameiswar

+0

먼저, 공용체를 사용하려면 동일한 열 이름을 사용해야합니다. 그래서 나는 정렬을 위해 두 뷰에서 같은 별칭을 사용했습니다. –