繁体   English   中英

具有来自另一个表的数据和字段匹配的Oracle SQL UPDATE查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM