2017-09-15 55 views
0

如何將此查詢重新寫入樣本更新。有人可以一步一步解碼我嗎?是整個表格1在這裏得到更新/替代Oracle的相關更新

UPDATE 
    (SELECT 
    A.COLUMN1 A_COLUMN1, 
    B.COLUMN2 B_COLUMN2 
    FROM TABLE1 A,TABLE2 B 
    WHERE A.COLUMN3=B.COLUMN3 AND A.COLUMN4=B.COLUMN4) 
    SET A_COLUMN1=B_COLUMN2; 
+1

整個表沒有被更新。只有匹配的行是。 –

+0

@戈登林諾夫:謝謝,如果我寫這樣的東西。 Update TABLE1 set COLUMN1 =(SELECT B.COLUMN2 FROM TABLE1 A,TABLE2 B WHERE A.COLUMN3 = B.COLUMN3 AND A.COLUMN4 = B.COLUMN4)。這是對的嗎 ? – user1720827

回答

1

讓我回答這個問題。

子查詢正在使用內部聯接。因此,子查詢會過濾出與兩個表中的連接條件不匹配的行。這發生在更新之前。

因此,並非所有的行都會更新。如果要更新所有行,請使用left join或:

UPDATE TABLE1 
    SET A_COLUMN1 = (SELECT B.B_COLUMN2 
        FROM TABLE2 B 
        WHERE A.COLUMN3 = B.COLUMN3 AND A.COLUMN4 = B.COLUMN4 
        ); 
+0

你能爲我簡單更新並設置好嗎? – user1720827

+0

嗨戈登,對不起再次提出這個問題。由於它是一個相關的子查詢,因此TABLE1中的所有TABLE2行都正在搜索中。它的選擇多於必要。如果TABLE1中有任何NULL,它將作爲查詢中的錯誤返回。我試圖將第一段代碼轉換成PostgreSQL。那麼有沒有其他方法可以實現這一點。再次打擾你。 – user1720827

0

這樣,它只是觸摸公共元素

UPDATE TABLE1 
    SET A_COLUMN1 = (SELECT B.B_COLUMN2 
        FROM TABLE2 B 
        WHERE A.COLUMN3 = B.COLUMN3 AND A.COLUMN4 = B.COLUMN4 
        ) 
    WHERE EXISTS (SELECT B.B_COLUMN2 
        FROM TABLE2 B 
        WHERE A.COLUMN3 = B.COLUMN3 AND A.COLUMN4 = B.COLUMN4);