我认为这应该很简单,但我是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)
但当然它不起作用。我该怎么办?
答案 0 :(得分: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
答案 1 :(得分:2)
根据您的DBMS(SQL Server与Oracle)中是否有UPDATE .. FROM
,一种可能性是对每个列更新使用相关子查询。如果能够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
)