2010-07-30 3 views
1

두 테이블 모두 동일한 열을 사용합니다.SQL보기 값이 두 테이블 중 하나 또는 두 테이블 중 하나에 표시되는 경우

첫 번째 테이블에는 원본 원본 데이터가 들어 있으며 두 번째 테이블에는 원본 데이터가없는 곳에서 삽입 된 해당 데이터 OR 값의 수정본이 들어 있습니다.

테이블은 데이터에 표시된 개정판이있는보기에서 사용되어야합니다. 그렇지 않은 경우 원본 원본 데이터가 표시됩니다.

일반적으로 왼쪽 결합을 사용하면 문제가 없지만 성능상의 이유로이 작업을 수행하는 방법이 혼란 스럽습니다.

다음 샘플은 설명 도움이 더 나은

DECLARE @t1 TABLE (TimeStamp datetime,Value int) 
DECLARE @t2 TABLE (TimeStamp datetime,Value int) 

INSERT INTO @t1 (TimeStamp,Value) VALUES ('2000-01-01',10) 
INSERT INTO @t1 (TimeStamp,Value) VALUES ('2000-01-02',15) 
INSERT INTO @t1 (TimeStamp,Value) VALUES ('2000-01-04',5) 
INSERT INTO @t1 (TimeStamp,Value) VALUES ('2000-01-05',18) 
INSERT INTO @t1 (TimeStamp,Value) VALUES ('2000-01-06',12) 

INSERT INTO @t2 (TimeStamp,Value) VALUES ('2000-01-03',12) 
INSERT INTO @t2 (TimeStamp,Value) VALUES ('2000-01-05',20) 
INSERT INTO @t2 (TimeStamp,Value) VALUES ('2000-01-06',15) 

--SELECT STATEMENT HERE 

나는처럼되고 출력이 필요합니다

TimeStamp    Value 
----------------------- ----------- 
2000-01-01 00:00:00.000 10 
2000-01-02 00:00:00.000 15 
2000-01-03 00:00:00.000 12 
2000-01-04 00:00:00.000 5 
2000-01-05 00:00:00.000 20 
2000-01-06 00:00:00.000 15 

그래서 1월 3일의 값이 존재, 5, 6의 값이왔다 @ t2에서 가져온 값과 @ t1의 값은 출력에 없습니다. 나는 그 당신은 노동 조합으로 해결할 수

+0

@ t2에 여러 개의 리비전/행이 있습니까? – gbn

+0

필자의 경우 실제 코드에서 @ t2는 가장 최근 버전 인 –

+0

을 사용하는 리비전 테이블의 뷰입니다. 내 솔루션은 기본 테이블과 함께 작동 할 수 있습니다. – gbn

답변

4
SELECT 
    isnull(tbl2.timestamp, tbl1.timestamp) as TimeStamp, 
    isnull(tbl2.value,tbl1.value) as Value 
FROM 
    @t1 tbl1 
FULL OUTER JOIN @t2 tbl2 on tbl1.timestamp=tbl2.timestamp 

이것은 정확하게입니다. 이것은 책과 그것을하는 유일한 올바른 방법입니다. 이것은 적절한 해결책으로 사소한 일입니다. 다른 것은 훨씬 더 복잡하고 느릴 것입니다.

+0

일이 내가 이것을 시도하고 작동하지 않았다고 확신 해요! 감사합니다. 알렉산더. –

+0

향후 시청자를 위해 WHERE 절이 isnull/coalesce를 필요로합니다. 여기서 'isnull (tbl2.timestamp, tbl1.timestamp)>'2000-01-01 ' –

+0

전체 외부 조인을 사용하면 뷰 성능이 기본적으로 사용할 수없는 것으로 나타났습니다 (많은 수백만 행) NOT EXISTS/UNION 솔루션은 더 나은 성능을 제공합니다. 결과가 달라지는 모든 것과 마찬가지로, 내 결과를 공유하기를 원합니다. 이 질문은 원래의 질문에 대한 최선의 답변입니다. 특히 작은 테이블의 경우 더욱 그렇습니다. –

0

차이해야 SQL 서버 2005을 사용하고

: 테이블이 동일한 구조를 가지고 있지 않다면 분명히

SELECT * FROM t1 
    WHERE NOT EXISTS (SELECT * FROM t2 WHERE t2.TimeStamp = t1.TimeStamp) 
UNION 
SELECT * FROM t2 

에게, 당신은 필요 명시 적으로 열을 나열하십시오 (어쨌든 그렇게하는 것이 좋습니다).

+0

그게 완전 외부라고합니다. 어울리다. 이 3 개의 단어 대신에 UNION 및 NOT EXIST 절을 작성하여 총 3 개의 선택 항목에 합계했습니다. – AlexanderMP

+0

좋은 지적. 그러나 외부 조인은 각 열을 두 번 포함하는 결과 집합을 생성합니다 (한 번은 t1에서, 한 번은 t2에서). 양쪽 모두가 NULL 일 수 있습니다. 두 열 (예 : 각각의 주위에 ISNULL())에 넣으려면 추가 노력을해야합니다. – tdammers

관련 문제