如何在 SQL 中合并两个具有不同列和不同关系的表

发布于 2024-11-27 23:01:06 字数 1150 浏览 1 评论 0原文

如何在 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 均具有相应的 Visit_date 信息和缺席信息。

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

How do I combine columns and rows in the following example in SQL without pulling extra rows with nulls on columns that not existing in the other table? This should be similar to the OUTER UNION CORR in SAS.

EMP_ID and Dept_ID in the two tables don't have the exact ID list, e.g. ID in table A might not be in table B so as the other way around.

Table A

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

Table B

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

Expecting result like this - all EMP_ID with corresponding visit_date info and absent info.

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  

The only way worked for me is below. Is there better way to achieve this? Thanks!

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

酒与心事 2024-12-04 23:01:06

您可以执行FULL OUTER JOIN。它基本上是LEFT JOINRIGHT 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

You can do a FULL OUTER JOIN. It's basically a LEFT JOIN and a RIGHT JOIN combined. Something like this:

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
云醉月微眠 2024-12-04 23:01:06
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

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

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

Altough It probably it looks like about the same as you did.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文