MYSQL使用四个INNER JOINS更新表

时间:2012-11-15 01:34:47

标签: mysql

我有一个返回正确值的查询:

SELECT cnl.id         cID,
       snl.id         sID,
       cnl.fk_lei     cnl,
       sid.lei        sid,
       cnl.fk_cnty_id cCid,
       snl.fk_cnty_id sCid,
       sec.id         secID,
       sid.id         sidID
FROM   cici.name_loc cnl
       INNER JOIN se4.name_loc snl
               ON snl.legal_name = cnl.legal_name
                  AND snl.fk_cnty_id = cnl.fk_cnty_id
       INNER JOIN se4.sym_exch_cnty sec
               ON sec.id = snl.fk_sec_id
       INNER JOIN se4.identifiers sid
               ON sid.fk_sec_id = sec.id
                  AND sid.lei = 'NA'
WHERE  cnl.legal_name = 'Apple Inc.' 
+------+------+----------------------+-----+------+------+-------+-------+
| cID  | sID  | cnl                  | sid | cCid | sCid | secID | sidID |
+------+------+----------------------+-----+------+------+-------+-------+
| 2010 | 3104 | HWUPKR0MPOU8FGXBT394 | NA  |  233 |  233 | 13756 |  9722 |
+------+------+----------------------+-----+------+------+-------+-------+

我想修改它,以便我可以更新查询中使用的表中的字段。 所以在上面的结果中,字段'sid'将从'NA'更新为'HWUPKR0MPOU8FGXBT394'

确切地说,'标识符'表有一个需要的列'sid.lei' 只有在满足上述选择中的所有条件时,才会将“NA”更改为“cnl.fk_lei”table.column中的值。我只想更改一条记录,而不是表中的所有记录。

我尝试了几条路线,它们都给出了同样的错误: ERROR 1062(23000):密钥'mk_ident__6fks'重复输入'HWUPKR0MPOU8FGXBT394-NA-NA-NA-1-1'

这告诉我更新是错误的。

以下是我尝试过的更新之一:

UPDATE identifiers AS b
       INNER JOIN cici.name_loc cnl
               ON cnl.legal_name = 'Apple Inc.'
       INNER JOIN se4.name_loc snl
               ON snl.legal_name = cnl.legal_name
                  AND snl.fk_cnty_id = cnl.fk_cnty_id
       INNER JOIN se4.sym_exch_cnty sec
               ON sec.id = snl.fk_sec_id
SET    b.lei = cnl.fk_lei
WHERE  cnl.legal_name = 'Apple Inc.' 

在这种情况下,我只是尝试更新一条记录。但是,我有数百个 snl.legal_name = cnl.legal_name的记录,我需要用cnl.fk_lei中的数字更新所有记录。

任何想法都非常感谢。谢谢!

2 个答案:

答案 0 :(得分:1)

我认为您需要将sid.lei = 'NA'(缺失)替换为cnl.legal_name = 'Apple Inc.'(已存在于加入条件中),其中:

   UPDATE identifiers AS b
   INNER JOIN cici.name_loc cnl
           ON cnl.legal_name = 'Apple Inc.'
   INNER JOIN se4.name_loc snl
           ON snl.legal_name = cnl.legal_name
              AND snl.fk_cnty_id = cnl.fk_cnty_id
   INNER JOIN se4.sym_exch_cnty sec
           ON sec.id = snl.fk_sec_id
   SET    b.lei = cnl.fk_lei
   WHERE  sid.lei = 'NA' 

答案 1 :(得分:1)

以下是来自MySQL website

的更新语法
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]

您想要做的是以下内容:

UPDATE identifiers AS b
   SET b.lei = (select cnl.fk_lei
                  from cici.name_loc cnl
            INNER JOIN se4.name_loc snl  ON snl.legal_name = cnl.legal_name 
                   and snl.fk_cnty_id = cnl.fk_cnty_id
            INNER JOIN se4.sym_exch_cnty sec ON sec.id = snl.fk_sec_id
                 where cnl.legal_name = 'Apple Inc.')

请注意,这将更新所有identifiers行,您可能需要将where clause添加到更新中以限制其影响。