如何从链接 table 更新 table?

How to update table from linking table?

我正在使用 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_typezip_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 秒才能完成。

使用 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

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

  • How do I (or can I) SELECT DISTINCT on multiple columns?