Как объединить две таблицы с различными столбцами и различными отношениями в SQL - PullRequest
1 голос
/ 06 августа 2011

Как объединить столбцы и строки в следующем примере в SQL без вытягивания дополнительных строк с нулями в столбцах, которых нет в другой таблице?Это должно быть похоже на OUTER UNION CORR в SAS.

EMP_ID и Dept_ID в двух таблицах не имеют точного списка идентификаторов, например, идентификатор в таблице A может отсутствовать в таблице B, так как наоборот.

Таблица A

EMP_ID        Dept_ID          VISIT_CA_DATE  
001            01               5/2/2011                   
002            02               null                     
004            03               6/8/2011 

Таблица B

EMP_ID         Dept_ID        LAST_OUT        REASON  
001             01             6/1/2011        sick  
003             02             7/2/2011        vacation

Ожидаемый результат, подобный этому - все EMP_ID с соответствующей информацией о посещении и отсутствующей информацией.

EMP_ID     Dept_ID   VISIT_CA_DATE     LAST_OUT       REASON      
001         01         5/2/2011        6/1/2011        sick    
002         02         null            null            null    
003         02         null            7/2/2011        vacation    
004         03         6/8/2011        null            null  

Единственный способ, сработавший для меня ниже,Есть ли лучший способ добиться этого?Спасибо!

A LEFT OUTER JOIN B on A.EMP_ID=B.EMP_ID 
UNION 
B LEFT OUTER JOIN A ON B.EMP_ID=A.EMP_ID

Ответы [ 2 ]

3 голосов
/ 06 августа 2011

Вы можете сделать FULL OUTER JOIN. Это в основном LEFT JOIN и RIGHT JOIN вместе взятые. Примерно так:

SELECT  COALESCE(A.Emp_Id,B.Emp_Id) Emp_Id, 
        COALESCE(A.Dept_Id,B.Dept_Id) Dept_Id, 
        A.VISIT_CA_DATE,
        B.LAST_OUT,
        B.REASON
FROM TableA A
FULL OUTER JOIN TableB B
ON A.Emp_Id = B.Emp_Id AND A.Dept_Id= B.Dept_Id
1 голос
/ 06 августа 2011
SELECT t.EMP_ID, t.Dept_Id, A.VISIT_CA_DATE, B.LAST_OUT, B.REASON
FROM (
SELECT EMP_ID, Dept_Id FROM A
UNION
SELECT EMP_ID, Dept_Id FROM B
) t
LEFT JOIN A ON t.EMP_ID = A.EMP_ID
LEFT JOIN B ON t.EMP_ID = B.EMP_ID

Хотя, возможно, это выглядит примерно так же, как и вы.

...