【问题标题】:Create UPDATE from a SELECT-query including subquery retrieving several columns从 SELECT 查询创建 UPDATE,包括检索多个列的子查询
【发布时间】:2018-05-08 15:59:15
【问题描述】:

我有以下 SELECT 查询:

SELECT
    T3.EPSINO AS FaktNr, 
    T3.EPDIVI AS Div, 
    T3.EPSUNO AS Lev,
    T3.EPPYME AS BetMet,
    T2.Summa AS Belopp
FROM 
    M3EDBPTS.FPLEDG T3
JOIN 
    (SELECT 
         T1.EPCONO, T1.EPSINO, 
         T1.EPDIVI, T1.EPSUNO,
         SUM(T1.EPCUAM) AS Summa
     FROM 
         M3EDBPTS.FPLEDG T1
     WHERE 
         T1.EPCONO = 001 AND
         T1.EPDIVI = '500' AND
         T1.EPSUNO = '73823'
     GROUP BY 
         T1.EPCONO,T1.EPDIVI, T1.EPSUNO, T1.EPSINO
     HAVING 
         (SUM(T1.EPCUAM) <> 0)) AS T2 ON T3.EPCONO = T2.EPCONO 
                                      AND T3.EPDIVI = T2.EPDIVI 
                                      AND T3.EPSINO = T2.EPSINO 
                                      AND T3.EPSUNO = T2.EPSUNO

WHERE 
    T3.EPPYME IN ('KOT', 'ULK')

如何创建脚本来更新上面得到的结果?我试着写:

    UPDATE T3
    SET T3.EPPYME = 'SEP'
    FROM M3EDBPTS.FPLEDG T3
    JOIN (SELECT 
              T1.EPCONO, T1.EPSINO, T1.EPDIVI, T1.EPSUNO,
              SUM(T1.EPCUAM) AS Summa
          FROM M3EDBPTS.FPLEDG T1
          WHERE T1.EPCONO = 001 AND T1.EPDIVI = '500' AND
                T1.EPSUNO = '73823' 
          GROUP BY T1.EPCONO, T1.EPDIVI, T1.EPSUNO, T1.EPSINO
          HAVING (SUM(T1.EPCUAM) <> 0)) AS T2 ON T3.EPCONO = T2.EPCONO 
                                              AND T3.EPDIVI = T2.EPDIVI 
                                              AND T3.EPSINO = T2.EPSINO 
                                              AND T3.EPSUNO = T2.EPSUNO
    WHERE 
        T3.EPPYME IN ('KOT','ULK')

但我只得到错误:

SQL0199 - 没有预期的关键字 FROM。有效令牌:使用 SKIP WAIT WITH WHERE。

语法怎么错了?

示例 DB 表 FPLEDG:

FPLEDG

【问题讨论】:

  • 你一定是在开玩笑,问你的更新查询出了什么问题。只需查看 Internet 上任何更新 SQL 的语法,您就会知道。
  • SET移动到FROM声明下。
  • @a_horse_with_no_name Iseries/DB2
  • 显然 DB2 不支持 UPDATE 使用 sub-select 和 where,所以不得不使用 MERGE 命令。
  • @Lily 这部分不正确,DB2 的表表达式不能是连接或只读视图,但 set 语句可能包含像这样的子选择 (col1, col2, col3) = (select col1, col2, col3 from ...) 您需要确保sub-select 只为要更新的每一行返回一行,并且 update 语句不会尝试更新将导致 sub-select 不返回任何内容的行。

标签: sql join sql-update subquery db2-400


【解决方案1】:
    UPDATE M3EDBPTS.FPLEDG T3
    SET T3.EPPYME = 'SEP'
    WHERE T3.EPPYME IN ('KOT', 'ULK')
      AND EXISTS (
          SELECT 
              T1.EPCONO, T1.EPSINO, T1.EPDIVI, T1.EPSUNO,
              SUM(T1.EPCUAM) AS Summa
          FROM M3EDBPTS.FPLEDG T1
          WHERE T1.EPCONO = 001 AND T1.EPDIVI = '500' AND
                T1.EPSUNO = '73823' AND
                T3.EPCONO = T1.EPCONO AND
                T3.EPDIVI = T1.EPDIVI AND
                T3.EPSINO = T1.EPSINO AND
                T3.EPSUNO = T1.EPSUNO         
          GROUP BY T1.EPCONO, T1.EPDIVI, T1.EPSUNO, T1.EPSINO
          HAVING (SUM(T1.EPCUAM) <> 0))

这将是一般的攻击计划,但由于我不知道您的数据模型,您将不得不对其进行测试,看看子选择是否正确。

【讨论】:

  • 您好,感谢您的回复。我试过了,但我收到错误消息“SQL0199 - 关键字不符合预期。有效令牌:或使用跳过等待。”。然后我尝试在最后放置一个(在 EXISTS 和 a 之后),但我得到了相同的结果。我还尝试删除“AS Summa”并得到相同的回复,所以它似乎是错误所指的“AS T2”。
  • 谢谢,ON 子句是您在其中加入的保留。您仍然需要对其进行调整以准确获取您想要的信息。如果您向我们提供示例数据和列定义,我们可以提供更多帮助。
  • 我现在无法处理。如果您使用此信息编辑问题会更好。
  • 我编辑了问题并添加了FPLEDG的图片。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 2013-03-19
  • 1970-01-01
  • 2012-10-28
  • 2021-02-20
  • 1970-01-01
  • 2019-08-25
相关资源
最近更新 更多