【问题标题】:Oracle SQL UPDATE query with data and field matching from another tableOracle SQL UPDATE 查询与来自另一个表的数据和字段匹配
【发布时间】: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)?只有您知道您的数据和您的要求,所以只有您可以决定...

标签: sql database oracle join


【解决方案1】:
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
);

【讨论】:

    【解决方案2】:

    如错误消息中所示,您的子查询返回多行。在子查询中,不需要再次加入表 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)
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      相关资源
      最近更新 更多