我有两个桌子。我正在尝试根据不同表中存在的 type 字段和 feature 字段更新表中所有记录的 can_swim 字段。
有机表格:
id type can_swim
----------------------
1 raven (null)
2 dog (null)
3 fish (null)
说明表:
id feature
-------------------
1 wings
2 legs
3 fins
我的查询遇到的错误是:
Error at Command Line : 1 Column : 1
Error report -
SQL Error: ORA-00971: missing SET keyword
00971. 00000 - "missing SET keyword"
*Cause:
*Action:
我很困惑,因为查询中有SET关键字。
ORACLE查询:
UPDATE organism o, description d
SET o.can_swim =
CASE
WHEN o.type = 'raven' AND d.feature = 'wings' THEN 'No'
WHEN o.type = 'dog' AND d.feature = 'legs' THEN 'Yes'
WHEN o.type = 'fish' AND d.feature = 'fins' THEN 'Yes'
END
where o.id = d.id;
请帮助我解决此问题。
答案 0 :(得分:1)
使用子查询:
UPDATE organism o
SET o.can_swim = (SELECT CASE WHEN o.type = 'raven' AND d.feature = 'wings' THEN 'No'
WHEN o.type = 'dog' AND d.feature = 'legs' THEN 'Yes'
WHEN o.type = 'fish' AND d.feature = 'fins' THEN 'Yes'
END
FROM description d
WHERE o.id = d.id
);
如果您不想更新所有行,则子查询会有所帮助:
UPDATE organism o
SET o.can_swim = (SELECT CASE WHEN o.type = 'raven' AND d.feature = 'wings' THEN 'No'
WHEN o.type = 'dog' AND d.feature = 'legs' THEN 'Yes'
WHEN o.type = 'fish' AND d.feature = 'fins' THEN 'Yes'
END
FROM description d
WHERE o.id = d.id
)
WHERE EXISTS (SELECT 1
FROM description d
WHERE o.id = d.id
);
答案 1 :(得分:1)
您可以使用merge
语句,如下所示:
MERGE INTO ORGANISM O
USING (SELECT O.ID, CASE
WHEN o.type = 'raven' AND d.feature = 'wings' THEN 'No'
WHEN o.type = 'dog' AND d.feature = 'legs' THEN 'Yes'
WHEN o.type = 'fish' AND d.feature = 'fins' THEN 'Yes'
END AS CAN_SWIM
FROM organism o JOIN description d ON O.ID = D.ID) SRC
ON (O.ID = SRC.ID)
WHEN MATCHED THEN
UPDATE SET o.can_swim = SRC.CAN_SWIM;
答案 2 :(得分:0)
update (
select o.id, o.can_swim, o.type, d.feature
from organism o
join Description d
on o.id = d.id
)
set can_swim =
CASE
WHEN type = 'raven' AND feature = 'wings' THEN 'No'
WHEN type = 'dog' AND feature = 'legs' THEN 'Yes'
WHEN type = 'fish' AND feature = 'fins' THEN 'Yes'
END
select * from organism;
ID TYPE CAN_SWIM
---------- ----- -------------------
1 raven No
2 dog Yes
3 fish Yes
请注意,表description
必须在id
上具有主键(或至少具有唯一索引)。
否则您会遇到错误
ORA-01779: cannot modify a column which maps to a non key-preserved table