1

如何在 SQL 中组合以下示例中的列和行,而不在另一个表中不存在的列上提取带有空值的额外行?这应该类似于 SAS 中的 OUTER UNION CORR。

两个表中的 EMP_ID 和 Dept_ID 没有确切的 ID 列表,例如表 A 中的 ID 可能不在表 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
4

2 回答 2

3

你可以做一个FULL OUTER JOIN. 它基本上是aLEFT JOIN和a的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
于 2011-08-05T20:43:25.137 回答
1
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

虽然它可能看起来和你做的差不多。

于 2011-08-05T20:49:48.303 回答