【问题标题】:Multiple records update into a column with inner join DB2使用内连接 DB2 将多条记录更新为一列
【发布时间】:2017-12-15 07:29:51
【问题描述】:

我已经编写了这个更新语句来更新 DB2 中的记录。

UPDATE schemaname.tablename
SET fillerinfo = myfillerinfo
FROM schemaname.tablename,schemaname.tablename1
WHERE ID = uid1
AND PID=uuplanid
AND ACCTNO=uacctno

但是,在 AS400 DB2 上运行时。

我有这样的数据:

        Table1  | Table2
     fillerinfo |myfillerinfo
     -----------|-------------
         A      |   b
         c     |   D
       E       |   f

像上面一样,我有 50 万条记录。

显示错误:无法执行语句。

我收到错误:

关键字 FROM 不是预期的。有效令牌:使用 SKIP WAIT WITH WHERE。 原因 。 . . . . : 这里没有预期的关键字 FROM。语法 在关键字 FROM 处检测到错误。有效令牌的部分列表 在 WHERE 中使用 SKIP WAIT。此列表假定该语句是 更正到意外的关键字。错误可能早于 声明,但该声明的语法似乎对此有效 观点。恢复 。 . . : 检查区域中的 SQL 语句 指定的关键字。可能缺少冒号或 SQL 分隔符。 SQL 要求保留字在用作名称时进行分隔。 更正 SQL 语句并重试请求。

所以我参考了这个链接,看看它是否有帮助:https://oscarvalles.wordpress.com/2013/05/12/db2-update-with-inner-joins/

但是,上面链接中的这个例子显示更新单个记录。

如何使用 join 更新列中的多条记录?请提出建议。

【问题讨论】:

  • 尽可能添加更多细节,如表结构和示例数据

标签: db2 db2-400 iseries-navigator


【解决方案1】:

DB2 与 MS SQL Server 有点不同。您可以像这样从子选择中更新

UPDATE schemaname.tablename
SET fillerinfo = (SELECT myfillerinfo
                  FROM schemaname.tablename,schemaname.tablename1
                  WHERE ...)
WHERE ID = uid1
AND PID=uuplanid
AND ACCTNO=uacctno

我怀疑您可以在子选择中确定正确的 WHERE 子句。

【讨论】:

    【解决方案2】:

    改用 INNER JOIN

    UPDATE T1
    SET 
    fillerinfo = T2.myfillerinfo
    FROM schemaname.tablename t1
    INNER JOIN schemaname.tablename1 T2
    ON T1.ID = T2.uid1
    WHERE T1.PID=T2.uuplanid
    AND T1.ACCTNO=T2.uacctno
    

    或尝试合并

    MERGE INTO schemaname.tablename t1
        USING
        (
            SELECT
                uid1,
                uuplanid,
                uacctno,
                myfillerinfo 
                FROM schemaname.tablename1 
        )T2
            ON T1.ID = T2.uid1
        WHEN MATCHED AND T1.PID=T2.uuplanid
                AND T1.ACCTNO=T2.uacctno
            THEN UPDATE
                SET T1.fillerinfo = T2.myfillerinfo
    

    或者试试这个

    UPDATE schemaname.tablename T1
        SET 
            T1.fillerinfo = (SELECT T2.myfillerinfo FROM schemaname.tablename1 T2
                                WHERE T1.ID = T2.uid1
                                AND T1.PID=T2.uuplanid
                                AND T1.ACCTNO=T2.uacctno
                            )
            WHERE EXISTS
            (
                SELECT 1 FROM schemaname.tablename1 T2
                                WHERE T1.ID = T2.uid1
                                AND T1.PID=T2.uuplanid
                                AND T1.ACCTNO=T2.uacctno
            )
    

    【讨论】:

    • 您是否从 iSeries 导航器中尝试过这个?这行得通吗?我已经用确切的错误更新了我的问题。
    • 我在 SSMS 中使用过这种类型的查询。请将表格设计添加到问题中,以便我给出更详细的答案
    • 感谢您的回答。我会检查这些查询。我刚刚对此进行了裁判:stackoverflow.com/questions/1293330/…
    猜你喜欢
    • 2019-02-18
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多