在 3 个表之间更新 Oracle Sql

Update between 3 tables Oracle Sql

我有一个问题。

我得到了 3 tables 作为 Table1, Table2, Table3.

  1. Table1 --> 第 1 列 (PLATE),第 2 列 (DATE)
  2. Table2 --> 第 1 列 (PLATE),第 2 列 (BRAND)
  3. Table3 --> 第 1 列 (BRAND),第 2 列 (DATE)

我想用 Table3

DATE 列中的信息填充 Table1DATE

我们可以加入Table1 (PLATE)Table2 (PLATE)Table2(BRAND)Table3 (BRAND)

我试过了,但出现错误(无法修改映射到非键保留 table 的列)

UPDATE
    (
        SELECT TABLE1.DATE AS OLD_DATE,
               TABLE3.DATE AS NEW_DATE
          FROM TABLE1 
          JOIN TABLE2 ON TABLE1.PLATE = TABLE2.PLATE
          JOIN TABLE3 ON TABLE3.BRAND=TABLE2.BRAND
    ) TABLES
SET TABLES.OLD_DATE = TABLES.NEW_DATE
  ;

我该如何更新?

感谢帮助

此错误消息表明一个车牌可能映射到不同的品牌或品牌可能映射到不同的日期。因此,内联视图不可更新,因为它不是 key preserved table.

尝试设置值one-by-one:

UPDATE TABLE1 t1
   SET t1.OLD_DATE =
       (SELECT MIN(t3.DATE) AS NEW_DATE
          FROM TABLE2 t2
          JOIN TABLE3 t3 ON t2.BRAND = t3.BRAND
         WHERE t2.PLATE = t1.PLATE)
 WHERE EXISTS((SELECT t3.DATE AS NEW_DATE
                FROM TABLE2 t2
                JOIN TABLE3 t3 ON t2.BRAND = t3.BRAND
               WHERE t2.PLATE = t1.PLATE))

使用 MERGEMATCHED 选项对于您的情况来说是一个不错的选择,例如

MERGE INTO table1 t1 
USING (SELECT t3."date", t2.plate
         FROM table1 t1
         JOIN table2 t2 ON t1.plate = t2.plate
         JOIN table3 t3 ON t3.brand = t2.brand) tt
          ON ( t1.plate = tt.plate )
 WHEN MATCHED THEN UPDATE SET t1."date" = tt."date"

date是保留关键字,不能用作列名,除非double-quoted。所以,这是引用。顺便说一句,引用的标识符是 case-sensitive,我更喜欢 "date"(不是 "DATE")作为 table