【问题标题】:Update multiple rows by joining many tables通过连接多个表来更新多行
【发布时间】:2021-01-06 10:31:15
【问题描述】:

我有 3 个表,我正在尝试找到一种使用其他表数据更新多行的方法。 通过检查 table1 中的 id 是否链接到 table3 中的 idTab1 以及 table2 中的 id 是否链接到 Table3 中的 idTab2,只更新 table1 中的 null 或空“info”列与 Table2 中的“data”列

enter code here
Table1
id, info
 --------
 1, null
 2, info2
 3, null
 
 Table2
 id, data
  ---------
  1, info1
  2, info2
  3, info4

 Table3
 idTab1, idTab2
 ------
 1, 1
 2, 2
 3, 3

想要的结果是:

Table1
id, info
--------
 1, info1
 2, info2
 3, info3

提前谢谢你。

【问题讨论】:

    标签: sql db2


    【解决方案1】:

    您可以使用以下语法在 UPDATE 语句中连接 3 个表:

    UPDATE Table1
    SET Table1.info = t2.data
    FROM Table3 t3 INNER JOIN Table2 t2
    ON t2.id = t3.idTab2
    WHERE t3.idTab1 = Table1.id AND Table1.info IS NULL
    

    请参阅demo
    结果:

    > ID |  INFO
    > -: | ----:
    >  1 | info1
    >  2 | info2
    >  3 | info4
    

    【讨论】:

    • Db2 不支持此语法。
    • @IanBjorhovde 查看演示。
    • 非常感谢您回答我的问题。我使用了您的查询,它对我有用..
    【解决方案2】:
        CREATE TABLE TABLE1
        (
           ID TINYINT NOT NULL,
           INFO VARCHAR(100)
        )
        INSERT TABLE1(ID,INFO)
           SELECT 1,NULL 
            UNION ALL
           SELECT 2,'INFO2'
            UNION ALL
          SELECT 3,NULL
    
        CREATE TABLE TABLE2
        (
          ID TINYINT NOT NULL,
          DATA VARCHAR(100)NOT NULL
        )
    
        INSERT TABLE2(ID,DATA)
    
          SELECT 1,'INFO1'
            UNION ALL
          SELECT 2,'INFO2'
            UNION ALL
          SELECT 3,'INFO4'
    
        CREATE TABLE TABLE3
        (
          idTab1 TINYINT,
          idTab2 TINYINT 
        )
    
        INSERT TABLE3(idTab1,idTab2)
          SELECT 1,1
            UNION ALL
          SELECT 2,2
            UNION ALL
          SELECT 3,3     
    
        MERGE INTO TABLE1 AS DEST
        USING
        (
        SELECT T1.ID,T2.DATA
        FROM TABLE1 AS T1
        JOIN TABLE3 AS T3 ON T1.ID=T3.idTab1
        JOIN TABLE2 AS T2 ON T3.idTab2=T2.ID 
        )AS SRC ON DEST.ID=SRC.ID
        WHEN MATCHED AND (DEST.INFO IS NULL OR DEST.INFO='')THEN UPDATE SET
          DEST.INFO=SRC.DATA;
    
        SELECT *FROM TABLE1;
    
        --DROP TABLE TABLE1;
        --DROP TABLE TABLE2;
        --DROP TABLE TABLE3;
    

    【讨论】:

    • 非常感谢您花时间回答我的问题。我尝试了您的查询,但我没有工作,需要一些时间然后我收到来自我的 db2 服务器的错误。
    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多