UPDATE A
SET foo = 'bar',
car = 'bmw'
FROM TableA A
JOIN TableB B
ON A.col1 = B.colx
AND A.STATUS = B.STATUS
WHERE A.nbr = '1234'
and A.STATUS IN (K,Y)
and A.FILE_TYPE = 'R'
我正在嘗試使用上面的更新功能,但是當我嘗試運行它時,我不斷收到錯誤訊息,它沒有正確結束。有人能告訴我語法錯誤在哪里嗎?
.
uj5u.com熱心網友回復:
在 Oracle 資料庫中,當從另一個表更新一個表時,使用MERGE陳述句通常更容易。
MERGE INTO TableA A
USING TableB B ON (
A.col1 = B.colx
AND A.STATUS = B.STATUS
AND A.nbr = 1234
AND A.STATUS IN (K,Y)
AND A.FILE_TYPE = 'R'
)
WHEN MATCHED THEN UPDATE
SET foo = 'bar'
, car = 'bmw';
uj5u.com熱心網友回復:
在 Oracle 中,您不能 update進行連接查詢。您只能更新一個表(在某些情況下是一個視圖或一個子查詢)。
幸運的是,您可以update通過在where子句中傳遞條件來簡單地重寫您的無連接。
update TableA a
set foo = 'bar',
car = 'bmw'
WHERE a.nbr = '1234'
and a.STATUS IN ('K','Y')
and a.FILE_TYPE = 'R'
and (col1, status) in (select colx,status from tableB);
這是針對您所描述的問題的最簡單的解決方案。
請注意, 如果您真的需要連接,例如,如果您需要tableA使用tableB諸如的列更新 的列
UPDATE A
SET a.foo = b.foo,
a.car = b.car
....
您可以在 Oracle 中使用可更新的連接視圖,如下所示
update (
select a.*, b.foo new_foo, b.car new_car
FROM TableA A
JOIN TableB B
ON A.col1 = B.colx
AND A.STATUS = B.STATUS
WHERE A.nbr = '1234'
and A.STATUS IN ('K','Y')
and A.FILE_TYPE = 'R'
)
set foo = new_foo,
car = new_car
請注意,連接查詢用括號括起來以獲得正確的語法。
另請注意,tableB必須在列上具有主鍵(或唯一索引)colx,status才能進行更新。否則你會得到例外ORA-01779: cannot modify a column which maps to a non key-preserved table
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/407041.html
標籤:
