문제

할 수 있습니다 어떻게 해야 하나 프로그래밍 방식으로 정렬 union 쿼리를 당길 때 두 테이블에서 데이터를?예를 들어,

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1

예외가 발생

참고:이것은 시도되고 있 MS 액세스를 제트 데이터베이스 엔진

도움이 되었습니까?

해결책

때로는 당신이 필요합니다 ORDER BY 결합 해야하는 각 섹션에서 UNION.

이 경우

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

다른 팁

SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1

나는 이것이 설명의 좋은 일이라고 생각합니다.

다음은 순서 별 절을 사용하는 Union 쿼리입니다.

select supplier_id, supplier_name
from suppliers
where supplier_id > 2000
UNION
select company_id, company_name
from companies
where company_id > 1000
ORDER BY 2;

열 이름은 두 "select"문들 사이에 다르기 때문에 결과 세트에서 해당 위치에 따라 순서 별 절의 열을 참조하는 것이 더 유리합니다.

이 예에서는 결과를 분류했습니다 supplier_name / company_name "주문 x 2"로 표시되는 오름차순으로.

그만큼 supplier_name / company_name 필드는 결과 세트에서 위치 #2에 있습니다.

여기에서 가져온 것 : http://www.techonthenet.com/sql/union.php

구체적인 예를 사용하여 :

SELECT name FROM Folders ORDER BY name
UNION
SELECT name FROM Files ORDER BY name

파일 :

name
=============================
RTS.exe
thiny1.etl
thing2.elt
f.txt
tcpdump_trial_license (1).zip

폴더 :

name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents

원하는 출력 : (First Select First, IE 폴더 먼저)의 결과)

Contacts
Desktop
Downloads
Favorites
Links
My Documents
f.txt
RTMS.exe
tcpdump_trial_license (1).zip
thiny1.etl
thing2.elt

원하는 결과를 얻기 위해 SQL :

SELECT name 
FROM (
    SELECT 1 AS rank, name FROM Folders
    UNION 
    SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name

다음은 Northwind 2007의 예입니다.

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;

절차에 의한 순서는 모든 노조를 한 후에 마지막 진술이어야합니다. 여러 세트를 하나로 묶은 다음 마지막 세트 후에 조항으로 주문할 수 있습니다.

(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

일하다? 생각 세트를 기억하십시오. Union을 사용하려는 세트를 얻은 다음 작업을 수행하십시오.

SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC
SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

(별명 사용)

이것은 내가 본 것 중 가장 어리석은 일이지만 효과가 있으며 결과에 대해 논쟁 할 수 없습니다.

SELECT *
FROM (
    SELECT table1.field1 FROM table1 ORDER BY table1.field1
    UNION
    SELECT table2.field1 FROM table2 ORDER BY table2.field1
) derivedTable

파생 테이블의 내부는 자체적으로 실행되지 않지만 파생 테이블은 완벽하게 작동합니다. SS 2000, SS 2005, SS 2008 R2 및 세 가지 작업에서 이것을 시도했습니다.

이것이 어떻게 수행되는지입니다

select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 1
     order by pointy) A
union all
select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 2
     order by pointy desc) B

이 의견 섹션을 탐색하면서 질문에 대답하는 두 가지 다른 패턴이 발생했습니다. 슬프게도 SQL 2012의 경우 두 번째 패턴이 작동하지 않으므로 여기에 내 "작업"이 있습니다.


공통 열에서 주문하십시오

이것은 당신이 만날 수있는 가장 쉬운 경우입니다. 많은 사용자가 지적했듯이, 당신이 정말로해야 할 일은 Order By 쿼리가 끝날 때

SELECT a FROM table1
UNION
SELECT a FROM table2
ORDER BY field1

또는

SELECT a FROM table1 ORDER BY field1
UNION
SELECT a FROM table2 ORDER BY field1

다른 열에서 주문하십시오

실제로 까다로워지는 곳이 있습니다. SQL 2012를 사용하여 상단 게시물을 시도했지만 작동하지 않습니다.

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

의견의 추천에 따라 나는 이것을 시도했다

SELECT * FROM 
(
  SELECT TOP 100 PERCENT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT TOP 100 PERCENT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

이 코드는 컴파일되었지만 DUMMY_ALIAS1 그리고 DUMMY_ALIAS2 무시하십시오 Order By 설립 Select 이것을 사용할 수없는 진술.

내가 생각할 수있는 유일한 해결책은 노조를 사용하지 않고 대신 쿼리를 개별적으로 실행 한 다음 처리하는 것이 었습니다. 따라서 기본적으로 사용하지 않습니다 Union 네가 원할때 Order By

순서를 별도로 사용하면 각 서브 세트는 순서를 얻지 만 전체 세트는 아니기 때문에 두 테이블을 통합하려는 것입니다.

이런 식으로 사용해야합니다 하나 주문 세트 :

SELECT TOP (100) PERCENT field1, field2, field3, field4, field5 FROM 
(SELECT table1.field1, table1.field2, table1.field3, table1.field4, table1.field5 FROM table1
UNION ALL 
SELECT table2.field1, table2.field2, table2.field3, table2.field4, table2.field5 FROM  table2) 
AS unitedTables ORDER BY field5 DESC

두 번째 테이블에는 테이블 이름을 포함 할 수 없습니다. ORDER BY 절.

그래서...

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY field1

예외를 던지지 않습니다

내부 정렬을 유지하기 위해 필요한 경우 :

SELECT 1 as type, field1 FROM table1 
UNION 
SELECT 2 as type, field1 FROM table2 
ORDER BY type, field1
(SELECT FIELD1 AS NEWFIELD FROM TABLE1 ORDER BY FIELD1)
UNION
(SELECT FIELD2 FROM TABLE2 ORDER BY FIELD2)
UNION
(SELECT FIELD3 FROM TABLE3 ORDER BY FIELD3) ORDER BY NEWFIELD

이 시도. 그것은 나를 위해 일했다.

에 대한 Sql Server2014/2012/다른 사람(선택되지 않음):

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) 
as DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) 
as DUMMY_ALIAS2
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top