从子查询更新多列

时间:2019-12-11 06:28:30

标签: sql postgresql postgresql-9.4

UPDATE PINPOINT_SUPPLEMENT
            SET (ATTACHMENT_VALUE,ATTACHMENT_TYPE) = (
            SELECT key,'file'
            FROM PINPOINT_DOCUMENT
            WHERE PINPOINT_SUPPLEMENT.ATTACHMENT_VALUE::integer = PINPOINT_DOCUMENT.DOCUMENT_ID
            )
WHERE ATTACHMENT_VALUE IS NULL

执行此查询时出现错误

错误:“ SELECT”处或附近的语法错误 第3行:SELECT键,“文件”

2 个答案:

答案 0 :(得分:3)

update PINPOINT_SUPPLEMENT
set
    ATTACHMENT_VALUE = PINPOINT_DOCUMENT.key,
    ATTACHMENT_TYPE = 'file'
from PINPOINT_DOCUMENT
where
    PINPOINT_SUPPLEMENT.ATTACHMENT_VALUE::integer = PINPOINT_DOCUMENT.DOCUMENT_ID
    and PINPOINT_SUPPLEMENT.ATTACHMENT_VALUE IS NULL

update PINPOINT_SUPPLEMENT
set
    (ATTACHMENT_VALUE,ATTACHMENT_TYPE) = (PINPOINT_DOCUMENT.key, 'file')
from PINPOINT_DOCUMENT
where
    PINPOINT_SUPPLEMENT.ATTACHMENT_VALUE::integer = PINPOINT_DOCUMENT.DOCUMENT_ID
    and PINPOINT_SUPPLEMENT.ATTACHMENT_VALUE IS NULL

答案 1 :(得分:1)

Postgres 9.5中引入了对更新元组的支持,因此您不能在版本中使用该语法。

但是由于第二个值是一个常数,所以我看不出使用该语法开头的原因:

UPDATE PINPOINT_SUPPLEMENT
  SET ATTACHMENT_VALUE = (SELECT "key"
                          FROM PINPOINT_DOCUMENT
                          WHERE PINPOINT_SUPPLEMENT.ATTACHMENT_VALUE::integer = PINPOINT_DOCUMENT.DOCUMENT_ID), 
       ATTACHMENT_TYPE = 'file'
WHERE ATTACHMENT_VALUE IS NULL

请注意,如果ATTACHMENT_VALUE有多个document_id,则子查询可能会导致错误!

相关问题