2009-06-16 3 views
13

UNION 두 개의 유사한 데이터 집합이 있지만 둘 다 다른 테이블에 존재하지 않는 열이 있습니다. 즉 결과 UNION에 NULL 값이있는 열이 있습니다. UNION의 목적은 소프트웨어 측면에서 친숙한 형식으로 데이터를 가져 오는 것입니다.TSQL ORDER-BY가 다른 데이터 집합의 유니버스로

문제는 하나 또는 다른 세트에만 존재하는 열을 사용하여 결과 데이터를 ORDER해야합니다.

예 : 표 1에는 ID, Cat, Price 필드가 있습니다. Table2는 필드 ID (Table1과 동일), Name, Abbrv가 있습니다.

내 쿼리는 다음과 같이 다음과 같습니다 내가 붙어있어 어디

SELECT t1.ID, t1.Cat, t1.Price, NULL as Name, NULL as Abbrv FROM t1
UNION
SELECT t2.ID, NULL as Cat, NULL as Price, t2.Name, t2.Abbrv FROM t2
ORDER BY Price DESC, Abbrv ASC

순서에 따라입니다.
100---Balls-----1.53----------------------
200---Bubbles---1.24----------------------
100---------------------RedBall----101RB--
100---------------------BlueBall---102BB--
200---------------------RedWand----201RW--
200---------------------BlueWand---202BW--

그러나 나는 그것이 같이 할 : 데이터는 다음과 같습니다
100---Balls-----1.53----------------------
100---------------------RedBall----101RB--
100---------------------BlueBall---102BB--
200---Bubbles---1.24----------------------
200---------------------RedWand----201RW--
200---------------------BlueWand---202BW--

(사과 사람들은 읽기 어려운 경우 - 않았나 테이블을 보여 말씀해)

이것은 입니다. 매우 예를 들어 멍청이이고 속담은 "JOIN을 사용하십시오!" 답변을 적용 할 수 없습니다 (예 : 이미 가입 방법을 알고 있지만 최종 결과에서 원하는 것은 아닙니다).

이 작업을 수행하는 유일한 방법은 데이터 계층에서 돌아 오면 소프트웨어에서 데이터를 조작하는 것입니다. 그렇다면 그렇게하십시오. 그러나 나는 그것이 TSQL에서 할 수 있기를 바라고있다.

+0

id가 T2 제품을 T1 제품에 연결하지 않았습니까? RedWand 및 BlueWand가 Bubbles를 직면 한 것을 어떻게 알고 있습니까? – mundeep

+0

그는 질문에 : "Table2 필드 ID (Table1과 동일)" –

+0

모두에게 감사합니다 모두; 이것은 단지 첫 번째 질문 일뿐입니다. 그러나 이것은 이미 위대한 공동체처럼 보입니다. 또한, 내 질문이 의미하는 '아키텍처'를 비판하는 사람들을 위해 - 내가 받아 들인 대답에서 위와 아래에 무엇을 말했는지 주목 해주십시오 : 이것은 어리석은 사례입니다! 내 질문에 '테이블'실제로 집계 및 계산 된 필드를 여러 테이블 및 하위 쿼리를 포함하는 두 개의 매우 복잡한 SELECT 쿼리를 나타냅니다. 다시 한 번 감사드립니다! – NateJ

답변

22
Select ID, Cat, Price, Name, Abbrv 
From 
(SELECT t1.ID, t1.Cat, t1.Price, t1.Price AS SortPrice, NULL as Name, NULL as Abbrv 
FROM t1 
UNION 
SELECT t2.ID, NULL as Cat, NULL as Price, t1.Price as SortPrice, t2.Name, t2.Abbrv 
    FROM t2 
    inner join t1 on t2.id = t1.id 
) t3 
ORDER BY SortPrice DESC, Abbrv ASC 

어떻게 든 테이블 2의 데이터가 테이블 1에 링크되어 가격을 공유하고 있다는 것을 알아야합니다. abbrv의 Null이 먼저 올 것이기 때문에 SortAbbrv 열을 만들 필요가 없습니다.

+3

하위 쿼리에 별칭이 없으면이 쿼리를 실행하면 구문 오류가 발생합니다. 나는 너에게 시정을했다. +1 –

+0

맞습니다. 근본적으로 이것은 Price를 두 번째 쿼리에 넣기 때문에 정렬 할 수 있습니다. 이것은 실제 쿼리가 이미 복잡하지 않은 경우 훌륭한 해결책이 될 것입니다. 하위 쿼리 및 집계 및 계산 필드가 있으며 그 중 하나가 기본 SORT-er (이 경우 Price)입니다. 내가 실제로해야 할 일은 UNION의 하위 부분에있는 JOIN에 대해 전체 1 차 쿼리를 다시 복제하는 것입니다. 그래서 +1하고 받아 들였습니다. 그러나 더 이상 시간을 낭비하지 않으려 고합니다. 코드에서 데이터를 조작하는 것이 훨씬 쉬우 며, 아마도 더 깨끗합니다. – NateJ

+0

+1 좋은 답변 Jeff O – Catto

1

신속한 해결 방법은 임시 테이블이나 테이블 변수에 2 개의 삽입을 수행하는 것입니다. 임시 테이블에 삽입하는 과정에서 플래그 열을 정렬하여 정렬하고 그 플래그 열에 따라 정렬 할 수 있습니다.

+0

나는 그것을 생각했다. 그러나 그것을 피하려고 노력했다. 좋은 대답. – NateJ

0

내 머리 꼭대기에서 나는 최악의 시나리오는 모든 필드가있는 임시 테이블을 만드는 것입니다. T1 T2에서 임시 테이블에 INSERT INTO를 수행 한 다음 T2를 사용하여 임시 테이블에서 SELECT를 선택하십시오.

즉. 다음 필드 아이디, 고양이, 가격, 이름, Abbrv와 임시 테이블 (. 예를 들어 #temp)를 만들고 :

SELECT Id, Cat, Price, null, null INTO #temp FROM T1 
SELECT Id, null, null, Name, Abbrv INTO #temp FROM T2 
SELECT * FROM #temp ORDER BY Id, Price DESC, Abbrv ASC 

NB를 : 나는 삽입하지만 난에서 널 구문에 대한 100 % 확실하지 않다 그것이 효과가 있다고 생각합니다.

EDIT : 가격이 &으로 늘어났습니다. Id ... Id가 T1을 연결하지 않은 경우 & T2가 무엇입니까?

+0

ID를 무시하십시오. 가격은 기본 주문입니다. – NateJ

2

UNION 대신 UNION ALL을 사용하여 중복 검사 비용을 절약해야합니다.

SELECT * 
FROM 
(
SELECT t1.ID, t1.Cat, t1.Price, NULL as Name, NULL as Abbrv FROM t1 
UNION ALL 
SELECT t2.ID, NULL as Cat, NULL as Price, t2.Name, t2.Abbrv FROM t2 
) as sub 
ORDER BY 
    ID, 
    CASE WHEN Price is not null THEN 1 ELSE 2 END, 
    Price DESC, 
    CASE WHEN Abbrv is not null THEN 1 ELSE 2 END, 
    Abbrv ASC 
+0

내가 일하고있는 실제 쿼리에는 UNION ALL이 있습니다. 다시 한번, ID는 기본 ORDER-ER이 아니며 가격은입니다. ID는 이것을 기반으로하는 '실제'쿼리에서 정렬에 사용할 수 없습니다. – NateJ

관련 문제