在 3 个表之间更新 Oracle Sql
Update between 3 tables Oracle Sql
我有一个问题。
我得到了 3 tables 作为 Table1
, Table2
, Table3
.
Table1
--> 第 1 列 (PLATE
),第 2 列 (DATE
)
Table2
--> 第 1 列 (PLATE
),第 2 列 (BRAND
)
Table3
--> 第 1 列 (BRAND
),第 2 列 (DATE
)
我想用 Table3
的 DATE
列中的信息填充 Table1
的 DATE
列
我们可以加入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))
使用 MERGE
和 MATCHED
选项对于您的情况来说是一个不错的选择,例如
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
我有一个问题。
我得到了 3 tables 作为 Table1
, Table2
, Table3
.
Table1
--> 第 1 列 (PLATE
),第 2 列 (DATE
)Table2
--> 第 1 列 (PLATE
),第 2 列 (BRAND
)Table3
--> 第 1 列 (BRAND
),第 2 列 (DATE
)
我想用 Table3
DATE
列中的信息填充 Table1
的 DATE
列
我们可以加入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))
使用 MERGE
和 MATCHED
选项对于您的情况来说是一个不错的选择,例如
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