SQL - 如何从多个表中为每个 ID 的每个列选择最佳可用值?

SQL - How to pick the best available value for each column for each ID from multiple tables?

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

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

要求:

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

示例:

Table 1:

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

Table 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

尝试像下面这样使用 coalesce()

select t1.user_id, coalesce(t1.age,t2.age),
t1.income>t2.income then t1.income else t2.income end as income

table1 t1 join table2 t2 on t1.usesr_id=t2.user_id

如果每个 table 中的 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

我认为这是 full joincolaesce() 的优先逻辑:

select user_id, 
    coalesce(t1.age, t2.age) as age, 
    coalesce(t1.income, t2.income) as income
from table1 t1
full join table2 t2 using(user_id)
You can use below code:

   With TableA(Id,age,income) as
(   --Select Common Data

    select table_1.id,
    --Select MAX AGE
    case 
        when table_1.age> table_2.age or table_2.age is null then table_1.age else table_2.age 
    end,
    --Select MAX Income
    case 
        when table_1.income>table_2.income or table_2.income is null then table_1.income  else table_2.income  
    end
    from table_1 inner join table_2 on table_2.id=table_1.id 

union all

    -- Select Specific Data of Table 2
    select table_2.id,table_2.age,table_2.income
    from table_2 
    where table_2.id not in (select table_1.id from table_1)

union all

    -- Select Specific Data of Table 1
    select table_1.id,table_1.age,table_1.income
    from table_1
    where table_1.id not in (select table_2.id from table_2)

)select * from TableA