我正在尝试从另一个表(all_info)向一个表(some_data)添加一列;最初,id_a 和 id_b 将是足够的外键,我将使用它们来唯一标识表 all_info 中的值,以将其带到表 some_data。但是,在某些地方, some_data 中的某些id_b 已损坏。因此,我想向 some_data 添加一列,当 id_a 和 id_b 完全匹配时,它仍然使用 all_info 中的值,或者,如果 id_a 和 id_b 上不存在完全匹配但该特定 id_a 只有一个条目all_info,我们假设这就是我们想要的(并替换 some_data 中损坏的 id_b)
所以,给定两张表,
some_data all_info
id_a | id_b id_a | id_b | val
------------ --------------------
1 | a 1 | a | v_i
2 | b 2 | c | v_x
3 | c 2 | b | v_ii
4 | d 3 | d | v_iv
3 | e | v_v
4 | f | v_vi
我想获得:
id_a | id_b | val
------------------
1 | a | v_i
2 | b | v_ii
3 | c | NULL
4 | f | v_vi
到目前为止,我已经想到了两种方法,其中一种是初步的:
SELECT sd.*, ai.val
FROM some_data sd
LEFT OUTER JOIN all_info ai
ON sd.id_a = ai.id_a
AND (sd.id_b = ai.id_b OR COUNT(*) = 1)
当然,这本身是行不通的(也没有实现我替换坏 id_b 的次要目标),但是尝试使用 COUNT() 函数进行各种分组和选择,我找不到任何 SQL 认为可以运行的内容和。我还想尝试使用 SET 命令填充该列,但再次找不到使其工作的方法。
作为旁注,查看数据似乎 all_info 至少有一行与 id_a 和 id_b 上的 some_data 匹配。此外,当 id_a 和 id_b 匹配时,考虑到 id_b 的复杂性,可以安全地假设匹配是正确的。