我正在使用PostgreSQL数据库并在黑暗中查询。我有三(3)个表:zip_code
,zip_code_type
和temp_zip_type
。它们包含以下列:
zip_code
zip_5_digit text
type_id integer
zip_code_type
id integer
value text
temp_zip_type
temp_zip text
temp_type text
我正在尝试更新zip_code
并设置zip_code.type_id = zip_code_type.id
,以便zip_code.zip_5_digit
与temp_zip_type.temp_zip
匹配,temp_zip_type.temp_type
匹配zip_code_type.value
。
这是我的尝试:
UPDATE
zip_code
SET
type_id =
(
SELECT
id
FROM
zip_code_type
JOIN
temp_zip_type
ON
temp_type = value
WHERE
temp_zip = zip_5_digit
);
我要查找的结果是type_id
通过在表格中查找值来匹配zip_code_type.id
中的值。
我更改了temp_zip_type
并添加了一个名为temp_type_id
的整数列。我通过执行以下查询得到了我想要的结果:
UPDATE
temp_zip_type
SET
temp_type_id =
(
SELECT
id
FROM
zip_code_type
WHERE
temp_type = value
);
UPDATE
zip_code
SET
type_id =
(
SELECT
temp_type_id
FROM
temp_zip_type
WHERE
zip_5_digit = temp_zip
);
为了将来参考,是否有更高效的查询?这些查询需要147秒才能完成。
答案 0 :(得分:1)
使用FROM
clause of UPDATE
加入temp_zip_type
和zip_code_type
,并在一个简单的声明中完成所有操作:
UPDATE zip_code z
SET type_id = t.id
FROM temp_zip_type tmp
JOIN zip_code_type t ON t.value = tmp.temp_type
WHERE z.zip_5_digit = tmp.temp_zip
AND z.type_id IS DISTINCT FROM t.id; -- avoid empty updates
我添加了最后一行以避免空更新。它可能有用也可能没用。详细说明: