【问题标题】:db2 : SQL Update on inner joindb2:内部连接的 SQL 更新
【发布时间】:2014-07-25 21:29:40
【问题描述】:

我已经让这个 Select SQL 工作了

SELECT O.* , S.NEW_EOC_CNTRT_SQ
FROM  FAMSUNIT.EOCT025_OPP_WRK O INNER JOIN
(
    SELECT A.EOC_CNTRT_SQ AS OLD_EOC_CNTRT_SQ, (SELECT B.EOC_CNTRT_SQ  
                FROM FAMSUNIT.EOCT020_CNTRT B 
                WHERE  B.ALIAS_CNTRT_ID = A.ALIAS_CNTRT_ID 
                AND CREA_USER_SQ IN (5,3) ) AS NEW_EOC_CNTRT_SQ
    FROM FAMSUNIT.EOCT020_CNTRT A       
    WHERE  A.ALIAS_CNTRT_ID IN ('12826')  
    AND CREA_USER_SQ NOT IN (5,3)
) S ON O.EOC_CNTRT_SQ = S.OLD_EOC_CNTRT_SQ

但是当我尝试将其转换为更新语句时出现错误 -

UPDATE O
SET O.EOC_CNTRT_SQ = S.NEW_EOC_CNTRT_SQ
FROM  FAMSUNIT.EOCT025_OPP_WRK O INNER JOIN
(
    SELECT A.EOC_CNTRT_SQ AS OLD_EOC_CNTRT_SQ, (SELECT B.EOC_CNTRT_SQ  
                FROM FAMSUNIT.EOCT020_CNTRT B 
                WHERE  B.ALIAS_CNTRT_ID = A.ALIAS_CNTRT_ID 
                AND CREA_USER_SQ IN (5,3) ) AS NEW_EOC_CNTRT_SQ
    FROM FAMSUNIT.EOCT020_CNTRT A       
    WHERE  A.ALIAS_CNTRT_ID IN ('12826')  
    AND CREA_USER_SQ NOT IN (5,3)
) S ON O.EOC_CNTRT_SQ = S.OLD_EOC_CNTRT_SQ;

错误 [42601] [IBM][DB2] SQL0199N 在“”之后使用保留字“FROM”无效。预期的标记可能包括:“(.MICROSECOND SECOND SECOND MINUTES MINUTE”。SQLSTATE=42601

【问题讨论】:

  • 您需要复习一下 UPDATE 语句的语法。 UPDATE <TABLE_NAME> SET <COLUMN_NAME> = _________ WHERE .....
  • 我知道标准的更新语句,但我正在尝试根据我已形成 SQL 语句的内部子查询的联接更新多条记录。但不确定如何将其转换为 Update 语句。无论我得到什么,都是从堆栈溢出中查看其他示例

标签: sql db2


【解决方案1】:
UPDATE
(
  SELECT O.EOC_CNTRT_SQ AS old_sq
       , S.NEW_EOC_CNTRT_SQ AS new_sq
    FROM  FAMSUNIT.EOCT025_OPP_WRK O
    INNER JOIN
    (
      SELECT A.EOC_CNTRT_SQ AS OLD_EOC_CNTRT_SQ
           , (
               SELECT B.EOC_CNTRT_SQ  
                 FROM FAMSUNIT.EOCT020_CNTRT B 
                 WHERE  B.ALIAS_CNTRT_ID = A.ALIAS_CNTRT_ID 
                 AND CREA_USER_SQ IN (5,3)
             ) AS NEW_EOC_CNTRT_SQ
        FROM FAMSUNIT.EOCT020_CNTRT A       
        WHERE  A.ALIAS_CNTRT_ID IN ('12826')  
        AND CREA_USER_SQ NOT IN (5,3)
    ) S ON O.EOC_CNTRT_SQ = S.OLD_EOC_CNTRT_SQ
) foo
SET foo.old_sq = foo.new_sq
;

【讨论】:

  • 错误 [42601] [IBM][DB2] SQL0104N 在“”之后发现了意外的标记“(”。预期的标记可能包括:“ STATISTICS”。SQLSTATE=42601
  • A.) 你必须认真地知道那个错误并没有告诉我什么。我不能让自己相信你不知道。 B.) 如果您的 SELECT 声明确实有效,那么没有理由这不应该有效。
  • 对不起!这对我来说很糟糕,因为我使用的是国产 db2 导航器,这就是它所说的。不过,我只是在研究,有人说 db2 不 DB2 不接受加入更新查询 - stackoverflow.com/questions/8008292/…。所以看起来它需要转换为MERGE。我现在正在努力……:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2018-06-25
  • 2022-01-16
  • 2014-06-09
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多