我在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)
);