我正在尝试将一些数据移植到一个新结构中,但这让我很费时间。
查询如下:
INSERT INTO atemp_addresses (id, city, state, country_id)
SELECT id, (SELECT name from cities WHERE id=adr.city_id limit 1),
(SELECT name FROM states WHERE id=(SELECT state_id FROM cities WHERE id=adr.city_id limit 1) limit 1), (SELECT country_id FROM states WHERE id=(SELECT state_id FROM cities WHERE id=adr.city_id limit 1) limit 1), FROM addresses adr
因为数据保存在其他表中,我必须使用所有这些子查询,这大大降低了速度。有更快的方法吗?
最佳答案
这是您的查询:
INSERT INTO atemp_addresses (id, city, state, country_id)
SELECT id,
(SELECT name from cities WHERE id = adr.city_id limit 1),
(SELECT name FROM states WHERE id = (SELECT state_id FROM cities WHERE id=adr.city_id limit 1) limit 1),
(SELECT country_id FROM states WHERE id=(SELECT state_id FROM cities WHERE id=adr.city_id limit 1) limit 1)
FROM addresses adr;
您反复使用没有ORDER BY
的LIMIT
。这意味着您将获得一个任意匹配行,该行可以从一次调用更改为下一次调用。
等效的查询应该是:
INSERT INTO atemp_addresses (id, city, state, country_id)
SELECT adr.id, c.name, s.name, s.country_id
FROM addresses adr JOIN
cities c
ON adr.city_id = c.id JOIN
states s
ON c.state_id = s.id;
您对 LIMIT
的使用表明可能有多个城市具有相同的 id
(数据库设计不佳的标志?)。如果是这样:
INSERT INTO atemp_addresses (id, city, state, country_id)
SELECT DISTINCT ON (adr.id) adr.id, c.name, s.name, s.country_id
FROM addresses adr JOIN
cities c
ON adr.city_id = c.id JOIN
states s
ON c.state_id = s.id
ORDER BY adr.id;
关于postgresql - 由于子查询,查询速度极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32684807/