MySQL更新从另一个表中选择

Kai*_*all 2 mysql sql

我有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
Run Code Online (Sandbox Code Playgroud)

这是Kommuner和Fylker表格的外观。

Kommuner表

在此处输入图片说明

菲尔克表

在此处输入图片说明

公司表 在此处输入图片说明

公司表

            | forretningsadresse_fylke  | forretningsadresse_kommune |
            |===========================|============================|
            |                           |                            |
            |                           |                            |
            |                           |                            |
            |                           |                            |
            |                           |                            |
            |                           |                            |
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!

Gor*_*off 5

您不想fylkerUPDATE语句中。您还应该使用适当的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
                                     );
Run Code Online (Sandbox Code Playgroud)

如果我们假设中有一个匹配项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
                                     );
Run Code Online (Sandbox Code Playgroud)

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

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