联接配置单元:填充缺少的列

rryofs0p  于 2021-06-28  发布在  Hive
关注(0)|答案(2)|浏览(347)

我是新来的Hive和我的sql知识是有点生疏,因此张贴问题就这样。
我有一个sap表中的数据,其中一列的值丢失。我想知道如何填充这些列。
例子:

+----------+-----------+--------+
| EBELN    | BELNR     | EBELP  |
|----------+-----------+--------|
|    1     |   123     |  001   |
|----------+-----------+--------|
|          |   123     |  002   |
|----------+-----------+--------|
|          |   123     |  003   |
+----------+-----------+--------+

在上表中,所有三行都相互关联,但值 EBELN 列仅出现在第一行中。
当我使用 EBELN 列作为联接键,联接中只显示第一行。我要将输出联接中的所有三行都带到。

Expected output:
    +----------+-----------+--------+
    | EBELN    | BELNR     | EBELP  |
    |----------+-----------+--------|
    |    1     |   123     |  001   |
    |----------+-----------+--------|
    |    1     |   123     |  002   |
    |----------+-----------+--------|
    |    1     |   123     |  003   |
    +----------+-----------+--------+

我希望输出是这样的,这样我就可以使用 EBELN 列。
我要加入的表不包含 BELNR 或者 EBELP 所以我不能用这些列来连接。
我想知道我能不能用 self join 或者这里还有什么我可以用的。
添加更多信息。我还有其他的table叫它d。那张table有 EBELN 列。

+----------+-----------+--------+
    |   EBELN  |   COL12   |  COL13 |
    |----------+-----------+--------|
    |    1     |   ABC     |  LMN   |
    |----------+-----------+--------|
    |    2     |   DEF     |  OPQ   |
    |----------+-----------+--------|
    |    3     |   GHI     |  RST   |
    +----------+-----------+--------+

我正在尝试使用将这个“d”表与“ekpf”表连接起来 EBELN 列。
我要把所有的行都找出来 BELNR 数字相同,但自 BELNR 列不在中 ABCD 表,我不能用它来加入。
最终连接的输出应该如下所示

+----------+-----------+--------+--------+--------+
    | EBELN    | BELNR     | EBELP  | COL12  | COL13  |
    |----------+-----------+--------+--------+--------|
    |    1     |   123     |  001   |   ABC  |   LMN  |
    |----------+-----------+--------+--------+--------|
    |          |   123     |  002   |   ABC  |   LMN  |
    |----------+-----------+--------+--------+--------|
    |          |   123     |  003   |   ABC  |  LMN   |
    |----------+-----------+--------+--------+--------|
    |    2     |           |        |  DEF   |  OPQ   |
    |----------+-----------+--------+--------+--------|
    |    3     |           |        |  GHI   |  RST   |
    +----------+-----------+--------+--------+--------+
up9lanfz

up9lanfz1#

在hive中,您可以使用其中一个条件函数来实现输出。
如果使用coalsce,只需执行以下操作:

SELECT COALESCE(EBELN, 1L) AS EBELN, BELNR,EBELP FROM your_table;

同样从hive0.11开始,您可以使用nvl函数

SELECT NVL(EBELN, 1) AS EBELN, BELNR,EBELP FROM your_table;
wlzqhblo

wlzqhblo2#

如果希望第一个(左)表中的所有记录在结果中生成相应的记录,即使第二个(右)表中没有匹配的记录,也可以使用 LEFT 加入。对于相反的情况,一次使用 RIGHT 加入。因为您想保留连接两边的记录,所以需要 FULL OUTER 加入。

SELECT COALESCE(t1.EBELN, t2.EBELN), t1.BELNR, t1.EBELP ,
       t2.COL12, t2.COL13
  FROM EKPF t1
  FULL OUTER JOIN ABCD t2 ON t1.EBELN = t2.EBELN
``` `COALESCE` 这里保证将填充join列(根据您的示例)。
输出为:

+----------+-----------+--------+--------+--------+
| EBELN | BELNR | EBELP | COL12 | COL13 |
|----------+-----------+--------+--------+--------|
| 1 | 123 | 001 | ABC | LMN |
|----------+-----------+--------+--------+--------|
| | 123 | 002 | ABC | LMN |
|----------+-----------+--------+--------+--------|
| | 123 | 003 | ABC | LMN |
|----------+-----------+--------+--------+--------|
| 2 | | | DEF | OPQ |
|----------+-----------+--------+--------+--------|
| 3 | | | GHI | RST |
+----------+-----------+--------+--------+--------+

相关问题