代码之家  ›  专栏  ›  技术社区  ›  Steve Blackwell

简单SQL update+join帮助

sql
  •  2
  • Steve Blackwell  · 技术社区  · 15 年前

    我认为这应该很简单,但我是一个SQL新手。

    我有两张桌子。一个是项目id和描述的列表,另一个是对应的新旧id的映射。这样地:

        ID_MAP
    OLD_ID   NEW_ID
    ---------------
    1        101
    2        102
    
        ITEMS
    ID       DESCRIPTION
    --------------------
    1        "ItemA"
    2        "ItemB"
    ...
    101      <null>
    102      <null>
    

    我需要根据地图把旧的物品描述复制到新的物品上。我想我需要用一个 inner join 在一个 update ,但它不起作用,我甚至不确定这是正确的方法。

    我试着说

    update ITEMS
    set (select ITEMS.DESCRIPTION
         from ITEMS
         join ID_MAP
         on ITEMS.ID = ID_MAP.NEW_ID) = 
        (select ITEMS.DESCRIPTION
         from ITEMS
         join ID_MAP
         on ITEMS.ID = ID_MAP.OLD_ID)
    

    但当然不行。我该怎么办?

    2 回复  |  直到 15 年前
        1
  •  5
  •   Joe Stefanelli    15 年前
    update new_item
        set description = old_item.description
        from items old_item
            inner join id_map im
                on old_item.id = im.old_id
            inner join items new_item
                on im.new_id = new_item.id
    
        2
  •  2
  •   Chris Cameron-Mills    11 年前

    取决于 UPDATE .. FROM 在DBMS中可用(SQL Server与Oracle)一种可能是对每个列更新使用相关的子查询。如果你能的话就不方便了 UPDATE FROM .

    UPDATE items i
    SET i.id = (
      SELECT new_id
      FROM id_map
      WHERE old_id = i.id
    )
    , description = (
      SELECT description
      FROM id_map
      WHERE old_id = i.id
    )
    

    你也可以在结尾加上以下内容

    WHERE EXISTS (
      SELECT 1
      FROM id_map
      WHERE old_id = id
    )