使用另一张表的选择结果更新MySQL数据

4
我有3个表格,分别是Companies(公司)、Kommuner(市镇)和Fylker(县)。
Companies表中有一个空字段forretningsadresse_fylke,但有另一个带有值的字段forretningsadresse_kommune。
基本上,我需要根据forretningsadresse_kommune的值填写forretningsadresse_fylke。
现在,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表的样子。
市镇表

enter image description here

县表

enter image description here

公司表 在此输入图像描述

公司表

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

我在想查询语句是否有问题?还有,值得一提的是,我尝试更新的表(Companies)有超过100万行。

提前感谢!


你能描述一下你的表吗?或者至少是Companies表。 - Wajih
我编辑了帖子。现在你也可以看到公司表格了。 - Kaizokupuffball
4个回答

10

你不想在 UPDATE 语句中使用 fylker。同时,你应该使用适当的 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。我相信这是您问题的意图。
另外,表别名使查询更容易编写和阅读。

是的,谢谢!你构建的最后一个查询非常好!我不确定我能否在UPDATE语句中使用JOIN语句,我认为那只适用于SELECT。但现在我知道了。我每天都学到新东西!谢谢! :) - Kaizokupuffball

2

您可以参考这个问题:

https://dev59.com/1GUp5IYBdhLWcg3wh39W

    UPDATE companies c
    JOIN Kommuner k ON c.kommuneID = k.kommuneID
    JOIN fylker f ON f.fylkeID = k.fylkeID
    SET c.forretningsadresse_fylke = f.fylkeNavn

2

试试这个:

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
)

0
UPDATE companies
SET companies.forretningsadresse_fylke = fylker.fylkeNavn
FROM companies, fylker, kommuner
WHERE companies.forretningsadresse_kommune = kommuner.kommuneNavn AND fylker.fylkeID = kommuner.fylkeID

https://dev59.com/yXNA5IYBdhLWcg3wKacx#1068471


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接