【发布时间】:2017-05-10 10:02:18
【问题描述】:
我在 Oracle SQL 数据库中有两个表。感兴趣的领域是:
表 A: 参考-A | A型 |时间戳-A
表 B: 参考-B | B型 |时间戳-B
表 B 中的时间戳字段是新创建的,因此全部为 NULL,我想使用表 A 中的时间戳值更新该字段。
Reference-A 和 reference-B 确实是一对一匹配的,但是每个引用都有多个具有不同类型的行,所以我还需要在类型上进行选择。 Type-A 和 Type-B 不一样,所以我需要对它们进行 IF-ELSE 匹配,例如:Type-B1 -> Type-A1, Type-B2 -> Type-A2
并非所有 Reference-B 和 Type-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:单行子查询返回多于一行”。
有什么想法吗?
【问题讨论】:
-
尝试在 SELECT 查询中使用 DISTINCT。
-
该错误意味着您的子查询为至少一组 a.reference 和 a.type 返回不止一行。如果子查询匹配多个时间戳,您需要决定子查询应该返回什么——它应该返回最新的还是最早的时间戳(最大/最小)?随机时间戳 (
rownum = 1)?只有您知道您的数据和您的要求,所以只有您可以决定...