【问题标题】:How to update table from linking table?如何从链接表更新表?
【发布时间】:2015-03-18 09:31:41
【问题描述】:

我正在使用 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 秒。

【问题讨论】:

  • 解释似乎比它必须的要复杂。最重要的是,您的表定义中没有 temp_type_id
  • @ErwinBrandstetter 我忘了提到我更改了表格以使我的查询正常工作。

标签: sql postgresql join sql-update


【解决方案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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2021-06-08
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多