[英]Oracle SQL UPDATE query with data and field matching from another table
我在Oracle SQL数据库中有两个表。 感兴趣的字段是:
表A:参考文献A | A型| 时间戳-A
表B:参考资料B | B型| 时间戳-B
表B中的时间戳字段是新创建的,因此都是NULL,我想用表A中的时间戳值更新该字段。
Reference-A和reference-B确实是一对一匹配的,但是每个具有不同Type的引用都有多个行,因此我还需要选择类型。 Type-A和Type-B不同,因此我需要对它们进行IF-ELSE匹配,例如:Type-B1-> Type-A1,Type-B2-> Type-A2
并非引用B和类型B的所有组合在表A中都具有匹配项,因此对于这些情况,它可以将表B中的时间戳设置为空。
那么,此UPDATE语句的SQL查询是什么样的? 我已经尝试过了这个(伪);
UPDATE B
SET timestamp = (
SELECT A.timestamp
FROM A, B
WHERE A.reference = B.reference
AND A.type =
(CASE
WHEN B.type = 'B1'
THEN 'A1'
WHEN B.type = 'B2'
THEN 'A2'
WHEN B.type = 'B3'
THEN 'A3'
WHEN B.type = 'B4'
THEN 'A4'
END)
);
但是,当我运行此查询时,出现以下错误:“ SQL错误:ORA-01427:单行子查询返回多个行”。
有任何想法吗?
UPDATE B
SET timestamp = (
SELECT A.timestamp
FROM A
WHERE A.reference = B.reference
AND A.type =
(CASE
WHEN B.type = 'B1'
THEN 'A1'
WHEN B.type = 'B2'
THEN 'A2'
WHEN B.type = 'B3'
THEN 'A3'
WHEN B.type = 'B4'
THEN 'A4'
END)
AND rownum < 2 -- !!! select only 1 row
);
如错误消息中所示,您的子查询返回多个行。 在子查询中,您无需再次连接表B。 如果表Reference-A和Reference-B确实一对一匹配,则可以像这样更新查询
UPDATE B
SET timestamp = (
SELECT A.timestamp
FROM A
WHERE A.reference = B.reference
AND A.type =
(CASE
WHEN B.type = 'B1'
THEN 'A1'
WHEN B.type = 'B2'
THEN 'A2'
WHEN B.type = 'B3'
THEN 'A3'
WHEN B.type = 'B4'
THEN 'A4'
END)
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.