2010-11-15 67 views
2

我想這應該是非常簡單的,但我是一個SQL福利局。幫助,簡單的SQL更新+聯接

我有兩個表。一個是項目ID和說明的列表,另一個是相應的舊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) 

但是,當然,它不工作。我該怎麼做?

回答

5
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

取決於如果UPDATE .. FROM在你的DBMS(SQL服務器VS 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 
)