首页 > 解决方案 > SQL - 如何从多个表中为每个 ID 的每个列选择最佳可用值?

问题描述

我有两个表,它们具有相同的变量,指的是一个人的属性。

如何组合来自两个这样的表的数据,为每个字段的每个表中的每个列选择最佳可用值?

要求:

  1. 对于每个字段,我想用任一表中的值填充它,优先考虑表 1。
  2. 任一表中的值都可以为 NULL
  3. 在组合表中,第 1 列的值可能来自表 2(如果表 1 缺少该人的值),第 2 列的值可能来自表 1(因为两个表都有一个值,但来自表 1 是首选)。
  4. 在我的真实示例中,我有很多列,因此首选代码重复较少的优雅解决方案。
  5. 一些用户可能只存在于其中一张表中。

例子:

表格1:

user_id | age | income
1       | NULL| 58000
2       | 22  | 60000
4       | 19  | 35000

表 2:

user_id | age | income
1       | 55  | 55000
2       | 19  | NULL
3       | 22  | 33200

期望的输出:

user_id | age | income
1       | 55  | 58000
2       | 22  | 60000
3       | 22  | 33200
4       | 19  | 35000

标签: sqlprestofull-outer-joinsql-null

解决方案


如果每个表中的 user_id 是唯一的,则使用完全外连接。

SELECT
  COALESCE(t1.user_id, t2.user_id) AS user_id,
  GREATEST(t1.age, t2.age) AS age,
  GREATEST(t1.income, t2.income) AS income
FROM t1
FULL OUTER JOIN t2 ON t1.user_id = t2.user_id

推荐阅读