使用从另一个表中选择的 MySQL 更新

新手上路,请多包涵

我有3张桌子。公司,Kommuner 和 Fylker。

公司表有一个空字段 forretningsadresse_fylke 但另一个字段 forretningsadresse_kommune 有一个值。

所以基本上,我需要填写 forretningsadresse_fylke ,基于 forretningsadresse_kommune 的值。

现在, forretningsadresse_kommune 的值和我想要的 forretningsadresse_fylke 的值存储在 Kommuner 和 Fylker 表中。

所以我写了这个查询,但这似乎不起作用,因为 600 秒后“MySQL 服务器消失了”。

 UPDATE companies, fylker, kommuner
SET companies.forretningsadresse_fylke = (
    SELECT fylkeNavn
    FROM fylker
    WHERE fylker.fylkeID = kommuner.fylkeID
)
WHERE companies.forretningsadresse_kommune = kommuner.kommuneNavn

这是 Kommuner 和 Fylker 表的外观。

通讯员表

在此处输入图像描述

菲克表

在此处输入图像描述

公司表 在此处输入图像描述

公司表

            | forretningsadresse_fylke  | forretningsadresse_kommune |
            |===========================|============================|
            |                           |                            |
            |                           |                            |
            |                           |                            |
            |                           |                            |
            |                           |                            |
            |                           |                            |

所以我想知道查询是否有问题?另外,值得一提的是,我尝试更新的表(公司)有超过 100 万行。

提前致谢!

原文由 Kaizokupuffball 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 637
2 个回答

您不希望在 fylker UPDATE 语句中出现 —。您还应该使用正确的 join 。所以第一个重写是:

 UPDATE companies c JOIN
       kommuner k
       ON c.forretningsadresse_kommune = k.kommuneNavn
    SET c.forretningsadresse_fylke = (SELECT f.fylkeNavn
                                      FROM fylker f
                                      WHERE f.fylkeID = k.fylkeID
                                     );

如果我们假设在 fylker 中有一个匹配,那么这很好。如果有多个匹配项,那么您需要选择一个。一个简单的方法是:

 UPDATE companies c JOIN
       kommuner k
       ON c.forretningsadresse_kommune = k.kommuneNavn
    SET c.forretningsadresse_fylke = (SELECT f.fylkeNavn
                                      FROM fylker f
                                      WHERE f.fylkeID = k.fylkeID
                                      LIMIT 1
                                     );

注意:这将更新所有具有匹配“kommuner”的公司。如果没有匹配的“fylker”,则该值将设置为 NULL 。我相信这是你问题的意图。

此外,表别名使查询更易于编写和阅读。

原文由 Gordon Linoff 发布,翻译遵循 CC BY-SA 3.0 许可协议

尝试这个:

 UPDATE companies c
SET companies.forretningsadresse_fylke = (
    SELECT fylkeNavn
    FROM Commoner k Left join Fylker f ON f.fylkeID = k.fylkeID
    where k.kommuneNavn = c.forretningsadresse_kommune
)

原文由 Wajih 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏