0

我正在尝试从另一个表(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 的复杂性,可以安全地假设匹配是正确的。

4

2 回答 2

1

您的选择将是这样的:

SELECT sd.id_a, sd.id_b, 
       CASE WHEN ai.id_a IS NULL THEN ai2.val ELSE ai.val END as val

FROM   some_data sd

       LEFT JOIN all_info ai
       ON ad.id_a = ai.id_a AND ad_id_b = ai.id_b

       LEFT JOIN 
       (SELECT id_a, MIN(id_b) id_b, MIN(val) val
        FROM   all_info
        GROUP BY id_a
        HAVING COUNT(*) = 1
       ) ai2 ON sd.id_a = ai.id_a
于 2012-11-19T22:17:06.433 回答
0

你可以运行它来修复你的数据:

UPDATE some_data sd

       JOIN 
       (SELECT id_a, MIN(id_b) id_b
        FROM   all_info
        GROUP BY id_a
        HAVING COUNT(*) = 1
       ) ai ON sd.id_a = ai.id_a AND sd.id_b <> ai.id_b

SET    ad.id_b = ai.id_b
于 2012-11-19T22:10:42.873 回答