从另一个表中选择MySQL更新

时间:2016-04-30 13:52:06

标签: mysql sql

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

公司表格中包含空字段forretningsadresse_fylke,但其他字段forretningsadresse_kommune包含值。

基本上,我需要根据forretningsadresse_fylke的值填写forretningsadresse_kommune

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

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

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表格的样子。

Kommuner表

enter image description here

Fylker表

enter image description here

公司表 enter image description here

公司表

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

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

提前致谢!

4 个答案:

答案 0 :(得分:4)

您不希望在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。我相信这是你问题的意图。

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

答案 1 :(得分: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
)

答案 2 :(得分:0)

你可以参考这个问题

https://stackoverflow.com/questions/15209414/how-to-use-join-in-update-query

    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

答案 3 :(得分: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://stackoverflow.com/a/1068471/3866134