2009-07-08 2 views
3

두 개의 하위 쿼리 (예 : SUB1과 SUB2)의 결과를 결합하고 싶습니다. 하위 쿼리에는 ID 열을 포함하여 여러 열이 있습니다.Union과 Except를 결합한 SQL

SUB1에 ID = 1이있는 경우 SUB1에서 ID = 1 행만 포함하고 SUB2에서는 ID = 1 행을 포함하지 않도록합니다.

예 :

ID | Date 
1 | 7/4 
3 | 7/8 

나는

ID | Date 
1 | 7/1 
2 | 7/3 
3 | 7/8 

내가 생각할 수있는 유일한 방법이 노조 결과를 싶습니다 SUB1이 다음 행과 열이 있다면

ID | Date 
1 | 7/1 
2 | 7/3 

그리고 SUB2은 다음과했다 무엇이든 할 것입니다.

SELECT * FROM (SUB1) 

UNION 

SELECT * FROM (SUB2) 
WHERE ID NOT IN 
(SELECT ID FROM (SUB1)) 

유일한 관심사는 SUB1과 SUB2가 긴 쿼리라는 것입니다. 내 질문에 SUB1을 두 번 붙여 넣지 않도록하십시오.

더 간결한 방법이 있습니까? 감사합니다

답변

4
SELECT COALESCE(sub1.id, sub2.id), COALESCE(sub1.date, sub2.date) 
FROM sub1 
FULL OUTER JOIN 
     sub2 
ON  sub1.id = sub2.id 
+0

감사합니다. – David

0

당신은 ID로 그룹화 할 수 있습니다.

SELECT ID, MAX(Date) FROM (SUB1) 
UNION 
SELECT ID, MAX(Date) FROM (SUB2) 
GROUP BY ID 
4

SQL Server 2005 또는 이상을 사용하는 경우, 공통 테이블 식을 두 번 코드를 입력하지에 도움이됩니다

; with CTE_Sub1 as (select * from (Sub1)) 
select * from CTE_Sub1 
union 
select * from (sub2) 
where ID not in (select id from CTE_Sub1) 
+0

내가 작업하고있는 서버는 SQL Server 2000이지만 이것도 알아두면 좋습니다. 당신의 도움을 주셔서 감사합니다. – David

0

무엇 FULL OUTER JOIN과 ISNULL은 어떻습니까?

SELECT 
    ISNULL(SUB1.ID, SUB2.ID), 
    ISNULL(SUB1.[Date], SUB2.[Date]) 
FROM 
    SUB1 
FULL OUTER JOIN 
    SUB2 
ON 
    SUB1.ID = SUB2.ID 
관련 문제