Sql 多个id上的内部联接';如果它们不为null,则为s
我在创建捕获以下记录的联接时遇到了一些问题。我昨天花了大约5个小时想弄明白,但是弄不明白 我有两张桌子,桌子A和桌子B 这两个表都有以下列:Sql 多个id上的内部联接';如果它们不为null,则为s,sql,database,join,hive,Sql,Database,Join,Hive,我在创建捕获以下记录的联接时遇到了一些问题。我昨天花了大约5个小时想弄明白,但是弄不明白 我有两张桌子,桌子A和桌子B 这两个表都有以下列: ID_1, ID_2, ID_3, ID_4 现在,我需要在两个表之间创建一个连接,以便结果在匹配的ID上提取不为null的记录,如果超过1个ID匹配,那么我将使用所有匹配的ID提取记录,因此有两种情况: 场景1:两个表中的所有ID都完全匹配(这很容易编码) 在这里,我将通过所有ID加入。 +--------+---------+---------+-
ID_1, ID_2, ID_3, ID_4
现在,我需要在两个表之间创建一个连接,以便结果在匹配的ID上提取不为null的记录,如果超过1个ID匹配,那么我将使用所有匹配的ID提取记录,因此有两种情况:
场景1:两个表中的所有ID都完全匹配(这很容易编码)
在这里,我将通过所有ID加入。
+--------+---------+---------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+---------+---------+--------+
| CAD | AAPL | 853 | 200 |
+--------+---------+---------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+--------+--------+--------+
| CAD | TSLA | 341 | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | TSLA | NULL | 250 |
+--------+--------+--------+--------+
场景2:两个表中有一个或多个ID匹配,其余为空(也很简单)
在这里,我只能通过ID_1和ID_3加入。
+--------+--------+--------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | 341 | NULL |
+--------+--------+--------+--------+
| NULL | NULL | NULL | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | NULL | 250 |
+--------+--------+--------+--------+
| NULL | NULL | NULL | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| ID_1 | ID_2 | ID_3 | ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | 341 | NULL |
+--------+--------+--------+--------+
场景3:表中有一个或多个ID匹配,但有些不匹配
这里我只需要在ID_1和ID_2上加入,因为ID_3和ID_4对于各自的表都是空的。
+--------+---------+---------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+---------+---------+--------+
| CAD | AAPL | 853 | 200 |
+--------+---------+---------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+--------+--------+--------+
| CAD | TSLA | 341 | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | TSLA | NULL | 250 |
+--------+--------+--------+--------+
场景4:所有ID都为NULL,因此记录被拒绝
所以如果
表A包含以下内容:
+--------+--------+--------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | 341 | NULL |
+--------+--------+--------+--------+
| NULL | NULL | NULL | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | NULL | 250 |
+--------+--------+--------+--------+
| NULL | NULL | NULL | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| ID_1 | ID_2 | ID_3 | ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | 341 | NULL |
+--------+--------+--------+--------+
表B包含以下内容:
+--------+--------+--------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | 341 | NULL |
+--------+--------+--------+--------+
| NULL | NULL | NULL | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | NULL | 250 |
+--------+--------+--------+--------+
| NULL | NULL | NULL | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| ID_1 | ID_2 | ID_3 | ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | 341 | NULL |
+--------+--------+--------+--------+
结果将是:
+--------+--------+--------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| A.ID_1 | A.ID_2 | A.ID_3 | A.ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | 341 | NULL |
+--------+--------+--------+--------+
| NULL | NULL | NULL | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| B.ID_1 | B.ID_2 | B.ID_3 | B.ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | NULL | 250 |
+--------+--------+--------+--------+
| NULL | NULL | NULL | NULL |
+--------+--------+--------+--------+
+--------+--------+--------+--------+
| ID_1 | ID_2 | ID_3 | ID_4 |
+--------+--------+--------+--------+
| CAD | AAPL | 853 | 200 |
+--------+--------+--------+--------+
| CAD | NULL | 933 | NULL |
+--------+--------+--------+--------+
| CAD | TSLA | 341 | NULL |
+--------+--------+--------+--------+
谢谢也许你想要这样的东西?总有人会写更短的代码…:-)
嘿,谢谢你的解决方案,我还提出了一个类似的代码,但即使是这个代码也有同样的问题,因为假设在表B中ID_1为NULL,那么它将匹配表a中的ID_1,并作为记录的结果显示它,当ID_1的结果应为NULL时。@SimonWells我给出的解决方案适用于您提供的示例数据。我可能还不太了解你的情况。请更新您的样本数据以及您的预期结果。