数据和字段与另一个表匹配的Oracle SQL更新查询

数据和字段与另一个表匹配的Oracle SQL更新查询,sql,database,oracle,join,Sql,Database,Oracle,Join,我在Oracle SQL数据库中有两个表。感兴趣的领域包括: 表A: 参考-A |类型-A |时间戳-A 表B: 参考-B |类型-B |时间戳-B 表B中的时间戳字段是新创建的,因此全部为空,我想用表A中的时间戳值更新该字段 Reference-A和Reference-B确实是一对一匹配的,但是每个Reference都有多个不同类型的行,所以我还需要在类型上进行选择。Type-A和Type-B不一样,所以我需要对它们进行IF-ELSE匹配,例如:Type-B1->Type-A1,Type-B2

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

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

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

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

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

并不是所有引用-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:单行子查询返回多行


有什么想法吗?

如错误消息所示,您的子查询返回了多行。在子查询中,不需要再次联接表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)
      AND rownum < 2 -- !!! select only 1 row
);
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)
);

尝试在SELECT查询中使用DISTINCT。该错误的意思是,您的子查询为至少一组a.reference和a.type返回多行。您需要决定如果子查询与多个时间戳匹配,它应该返回什么-它应该返回最新的还是最早的时间戳max/min?随机时间戳rownum=1?只有您知道您的数据和需求,所以只有您可以决定。。。