2014-10-22 1 views
3

두 테이블 AB으로 작업하고 있습니다. 표 A은 주식 증권을 나타내며 표 B은 보안에 대한 세부 정보를 포함합니다.전체 외부 조인 순서로 결과 행 수가 달라집니다. 이유가 무엇입니까?

예를 들어, B.Item = 5301 인 경우 행은 특정 보안에 대한 가격을 지정합니다. B.Item = 9999 일 때, 행은 주어진 보안에 대한 배당금을 지정합니다. 나는 같은 행에 가격과 배당금을 모두 얻으려고 노력하고있다. 이것을 달성하기 위해, FULL JOINed 테이블 B 테이블에 두 번 A 두 번입니다.

SELECT * 
FROM a a 
     FULL JOIN (SELECT * 
        FROM b) b 
       ON b.code = a.code 
       AND b.item = 3501 
     FULL JOIN (SELECT * 
        FROM b) b2 
       ON b2.code = a.code 
       AND b.item = 9999 
       AND b2.year_ = b.year_ 
       AND b.freq = b2.freq 
       AND b2.seq = b.seq 
WHERE a.code IN (122514) 

Year_, Freq 같은 조인 절의 나머지 필드, 그리고 Seq 단지 가격과 배당금 경기 날짜 확인합니다. A.Code은 단순히 단일 보안을 식별합니다.

제 문제는 전체 조인 순서를 뒤집을 때 결과 수가 달라진다는 것입니다. 따라서 b.Item = 9999b.Item 2501 앞에 오면 한 가지 결과가 나옵니다. 다른 방법으로 나는 2 개의 결과를 얻습니다. 나는 테이블 B이 배당금에 대한 보안 122514에 대한 엔트리가 없다는 것을 깨달았지만, 가격에 대해서는 두 개의 엔트리가 있습니다.

먼저 가격을 지정하면 가격과 배당 필드가 모두 null이됩니다. 그러나 배당을 먼저 지정하면 배당 필드는 NULLs이고 가격 필드는 nulls이됩니다.

두 가격 항목이 표시되지 않는 이유는 무엇입니까? 나는 그들이 그렇게 할 것으로 기대할 것입니다 FULL JOIN

+0

*이 Fulljoins *의 순서를 뒤집기 : 그냥 IDS, 또는 fulljoin 문 쿼리 내부의 실제 위치를 교환하는 의미합니까? – dognose

답변

3

그것은 두 번째 FULL OUTER JOIN이 첫 번째 FULL OUTER JOIN을 참조하기 때문입니다. 이것은 질의를 근본적으로 변경하는 순서를 변경한다는 의미입니다. 여기

는 이것이 어떻게 작동하는지 보여줍니다 일부 의사-SQL :

DECLARE @a TABLE (Id INT, Name VARCHAR(50)); 
INSERT INTO @a VALUES (1, 'Dog Trades'); 
INSERT INTO @a VALUES (2, 'Cat Trades'); 
DECLARE @b TABLE (Id INT, ItemCode VARCHAR(1), PriceDate DATE, Price INT, DividendDate DATE, Dividend INT); 
INSERT INTO @b VALUES (1, 'p', '20141001', 100, '20140101', 1000); 
INSERT INTO @b VALUES (1, 'p', '20141002', 50, NULL, NULL); 
INSERT INTO @b VALUES (2, 'c', '20141001', 10, '20141001', 500); 
INSERT INTO @b VALUES (2, 'c', NULL, NULL, '20141002', 300); 

--Same results 
SELECT a.*, b1.*, b2.* FROM @a a FULL OUTER JOIN @b b1 ON b1.Id = a.Id AND b1.ItemCode = 'p' FULL OUTER JOIN @b b2 ON b2.Id = a.Id AND b2.ItemCode = 'c'; 
SELECT a.*, b2.*, b1.* FROM @a a FULL OUTER JOIN @b b1 ON b1.Id = a.Id AND b1.ItemCode = 'c' FULL OUTER JOIN @b b2 ON b2.Id = a.Id AND b2.ItemCode = 'p'; 

--Different results 
SELECT a.*, b1.*, b2.* FROM @a a FULL OUTER JOIN @b b1 ON b1.Id = a.Id AND b1.ItemCode = 'p' FULL OUTER JOIN @b b2 ON b2.Id = a.Id AND b2.ItemCode = 'c' AND b2.DividendDate = b1.PriceDate; 
SELECT a.*, b2.*, b1.* FROM @a a FULL OUTER JOIN @b b1 ON b1.Id = a.Id AND b1.ItemCode = 'c' FULL OUTER JOIN @b b2 ON b2.Id = a.Id AND b2.ItemCode = 'p' AND b2.DividendDate = b1.PriceDate;