如何从链接表更新表?

时间:2015-03-18 09:31:42

标签: sql postgresql join sql-update

我正在使用PostgreSQL数据库并在黑暗中查询。我有三(3)个表:zip_codezip_code_typetemp_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_digittemp_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秒才能完成。

1 个答案:

答案 0 :(得分:1)

使用FROM clause of UPDATE加入temp_zip_typezip_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

我添加了最后一行以避免空更新。它可能有用也可能没用。详细说明: