我有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万行。
提前致谢!
您不想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
);
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。我相信这是您提出问题的目的。
此外,表别名使查询更易于编写和阅读。