【问题标题】:UPDATE with INNER JOIN or MIN?使用 INNER JOIN 或 MIN 更新?
【发布时间】:2011-09-07 14:02:37
【问题描述】:

我正在尝试在表之间传输一些数据。 “新”表可以有多个数据条目,而这些数据原本不应该在“旧”表中有多个条目。我想从“旧”表中获取数据并将其复制到新表中,其中 NEW.ID 最低,其中 new.OtherID=old.OtherID,基本上每组 OtherID 的 MIN(ID) 等于彼此。

“新”表

ID | OtherID | Data
1       1      NULL
2       1      NULL
3       2      NULL
4       3      NULL
5       3      NULL

'旧'

OtherID | Data <br>
1            data1
2            data2
3            data3
4            data4
5            data5

更新的“新”表的预期结果:

ID | OtherID | Data <br>
1       1       data1
2       1       NULL
3       2       data2
4       3       data3
5       3       NULL

谢谢!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这就是你如何在 MySQL 中使用 INNER JOIN 和 UPDATE

    UPDATE NEW n
      INNER JOIN (
        SELECT
          OtherID,
          MIN(ID) AS ID
        FROM NEW
        GROUP BY OtherID
      ) m ON n.ID = m.ID
      INNER JOIN OLD o ON n.OtherID = o.OtherID
    SET n.Data = o.Data
    

    【讨论】:

    • 将子查询放在 JOIN 中比其他建议更具可读性。
    【解决方案2】:

    你可以试试:

    UPDATE new
       SET Data = ( SELECT DATA FROM old WHERE otherID = new.otherID )
     WHERE NOT EXIST
           ( SELECT NULL FROM new AS new2
              WHERE new2.id < new.id
                AND new2.otherID = new.otherID )
    

    请注意,这是标准 SQL92,应该适用于任何 RDBMS。

    【讨论】:

    • 我收到错误 #1093,您不能在 FROM 子句中指定目标表 'new' 进行更新
    • 那是因为它也是子查询的一部分,我开始认为您可能需要在 PHP(或类似)脚本中执行它...
    【解决方案3】:

    这在 PostgreSQL 中对我有用,但我可能对 MySQL 的引用有误。

    UPDATE newtable SET
     `Data` = oldtable.`Data`
    FROM
     oldtable
    WHERE
     newtable.`ID` IN (
      SELECT MIN(sub_newtable.`ID`)
      FROM newtable sub_newtable
      GROUP BY
       sub_newtable.`OtherID`
     )
     AND newtable.`OtherID` = oldtable.`OtherID`
    

    【讨论】:

      【解决方案4】:

      你可以使用:

      UPDATE `NEW` 
      LEFT JOIN `OLD` 
          ON `NEW`.`OtherID` = `OLD`.`ID`
      SET `NEW`.`Data` = `OLD`.`Data`
      

      编辑:对不起,这将更新与 OLD 中的列对应的所有记录。

      【讨论】:

        猜你喜欢
        • 2014-11-30
        • 1970-01-01
        • 2021-10-18
        • 2019-05-27
        • 2014-06-07
        • 2013-01-07
        • 2021-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多