1

`FULL JOIN` 和 `UNION ALL`

在 SQL 中,`FULL JOIN` 和 `UNION ALL` 是两种不同的操作,它们的结果也有显著的区别。

### FULL JOIN
`FULL JOIN`(全外连接)会返回两张表中所有的记录。对于没有匹配的记录,结果中会用 `NULL` 填充缺失的部分。具体来说:

- 如果表 A 和表 B 中有匹配的记录,这些记录会合并在一起。
- 如果表 A 中有记录在表 B 中没有匹配,结果中会显示这些记录,表 B 的字段会用 `NULL` 填充。
- 如果表 B 中有记录在表 A 中没有匹配,结果中会显示这些记录,表 A 的字段会用 `NULL` 填充。

### UNION ALL
`UNION ALL` 会将两张表的所有记录合并在一起,包括重复的记录。它不会去除重复项,也不会进行任何匹配。具体来说:

- 表 A 的所有记录会被列出。
- 表 B 的所有记录会被列出。
- 如果表 A 和表 B 中有相同的记录,它们会在结果中重复出现。

### 举例说明
假设有以下两张表:

**表 A**
| id | name |
|----|-------|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |

**表 B**
| id | age |
|----|-----|
| 2 | 30 |
| 3 | 25 |
| 4 | 40 |

- 使用 `FULL JOIN` 的结果:

| id | name | age |
|----|--------|------|
| 1 | Alice | NULL |
| 2 | Bob | 30 |
| 3 | Charlie| 25 |
| 4 | NULL | 40 |

- 使用 `UNION ALL` 的结果:

| id | name | age |
|----|--------|------|
| 1 | Alice | NULL |
| 2 | Bob | NULL |
| 3 | Charlie| NULL |
| NULL | NULL | 30 |
| NULL | NULL | 25 |
| NULL | NULL | 40 |

### 总结
- `FULL JOIN` 关注的是两张表的匹配和缺失记录,结果中会合并相关字段。
- `UNION ALL` 只是简单地将两张表的记录叠加在一起,不考虑匹配关系。

希望这个解释能帮助你理解这两者之间的区别!

 


在 Hive 中,虽然没有直接的 `FULL JOIN` 语法,但可以通过组合 `LEFT JOIN` 和 `RIGHT JOIN` 来实现类似的效果。下面是一个示例,展示如何在 Hive 中创建两张表,并使用 `FULL JOIN` 和 `UNION ALL` 来结合它们的结果。

### 创建表

```sql
CREATE TABLE TableA (
id INT,
name STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

CREATE TABLE TableB (
id INT,
age INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
```

### 插入数据

```sql
-- 插入 TableA 的数据
INSERT INTO TABLE TableA VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie'),
(4, 'David'),
(5, 'Eva');

-- 插入 TableB 的数据
INSERT INTO TABLE TableB VALUES
(2, 30),
(3, 25),
(4, 40),
(6, 28),
(7, 22);

### 使用 FULL JOIN 的实现

在 Hive 中,可以通过 `LEFT JOIN` 和 `RIGHT JOIN` 来模拟 `FULL JOIN`:

```sql
-- FULL JOIN 的实现
SELECT
A.id AS A_id,
A.name,
B.id AS B_id,
B.age
FROM
TableA A
LEFT JOIN
TableB B ON A.id = B.id

UNION ALL

SELECT
A.id AS A_id,
A.name,
B.id AS B_id,
B.age
FROM
TableA A
RIGHT JOIN
TableB B ON A.id = B.id
WHERE
A.id IS NULL; -- 只选择 TableB 中没有匹配的记录
```

### 使用 UNION ALL

使用 `UNION ALL` 来合并两张表的所有记录:

```sql
SELECT
id,
name,

FROM
TableA

UNION ALL

SELECT
id,

age
FROM
TableB;
```

### 结果示例

1. **FULL JOIN 的结果**(模拟):

| A_id | name | B_id | age |
|------|---------|------|-----|
| 1 | Alice | NULL | NULL|
| 2 | Bob | 2 | 30 |
| 3 | Charlie | 3 | 25 |
| 4 | David | 4 | 40 |
| 5 | Eva | NULL | NULL|
| NULL | NULL | 6 | 28 |
| NULL | NULL | 7 | 22 |

2. **UNION ALL 的结果**:

| id | name | age |
|-----|---------|-----|
| 1 | Alice | NULL|
| 2 | Bob | NULL|
| 3 | Charlie | NULL|
| 4 | David | NULL|
| 5 | Eva | NULL|
| 2 | NULL | 30 |
| 3 | NULL | 25 |
| 4 | NULL | 40 |
| 6 | NULL | 28 |
| 7 | NULL | 22 |

### 总结

- 在 Hive 中,使用 `LEFT JOIN` 和 `RIGHT JOIN` 的组合来模拟 `FULL JOIN`。
- `UNION ALL` 将两张表的记录简单地合并在一起,不考虑匹配关系。

希望这个示例能帮助你理解如何在 Hive 中使用 `FULL JOIN` 和 `UNION ALL`!如果有其他问题,请随时问我。

posted @ 2024-09-12 09:54  萌哥-爱学习  阅读(241)  评论(0编辑  收藏  举报