Oracle SQL UPDATE 查询,其中包含来自另一个表的数据和字段匹配



我在Oracle SQL数据库中有两个表。感兴趣的领域是:

表 A: 参考-A |A型 |时间戳-A

表 B: 参考-B |B型 |时间戳-B

表 B 中的时间戳字段是新创建的,因此全部为 NULL,我想使用表 A 中的时间戳值更新该字段。

引用 A 和引用 B 确实一对一匹配,但是每个引用都有多行,具有不同的类型,所以我还需要选择类型。A型和B型不一样,所以我需要对它们进行IF-ELSE匹配,例如:B1型->A1型,B2型->A2型

并非所有 Reference-B 和类型 B 的组合在表 A 中都匹配,因此对于这些情况,它可以将表 B 中的时间戳设置为 null。

那么这个 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)
);

相关内容

最新更新