2011-04-18 61 views
0

我遇到了Oracle更新SQL連接的問題。我有一個表A有5欄(C1, C2, C3, C4, C5);表B有3列(D1, D2, D3)。對於表A,我只使用2列(C2, C3)連接表B (D1, D2),並更新表A列C2與表B列D3。用連接更新重複列表

對於表A,C2和C3都會有很多重複;但對於條件C4爲10,將不會有重複,這是我想要更新。

例如,表A的記錄爲:

1,100,1500,10,'ORG' 
1,200,2000,10,'ORG' 
1,300,2500,10,'ORG' 
2,1000,500,20,'PERSON' 
2,1000,200,20,'PERSON' 
2,2000,200,20,'PERSON' 

你可以看到,對於C4爲10,對於C2和C3沒有重複。但對於C4爲20,C2和C3會有重複。

對於表B,就會像

100,1500,80 
200,2000,100 
300,3000,200 

沒有爲表乙沒有重複,將加入B,其中A爲= A.C2和B.D1 = A.C3到B.D2將A.C2更新爲B.D3。

我只需要根據B.D1和B.D2更新C4 = 10個記錄以便與表B連接。

我有SQL如下,但未能爲

ORA-01779:無法修改列 映射到一個非關鍵保留 表

誰能告訴我是什麼我的SQL錯誤?

UPDATE ( 
    SELECT A.C2 OID, B.D3 TID FROM A, B 
    WHERE A.C2 = B.D1 AND A.C3 = B.D2 AND A.C4=10 AND B.D3 <> ' ') 
SET OID = TID 

非常感謝!

+0

你可以發佈一些創建表和插入語句..你的問題很難理解。 http://tkyte.blogspot.com/2005/06/how-to-ask-questions.html – 2011-04-18 20:32:25

回答

0

首先,它聽起來就像你正試圖更新表A。其次,Update語句的官方ANSI規範不直接在語句中提供聯接(只能通過子查詢進行聯接)。其中一個原因是,當涉及重複行時,會產生歧義。所以,你可能會嘗試這樣的:

Update A 
Set OID = (
       Select B.D3 
       From B 
       Where B.D1 = A.C2 
        And B.D2 = A.C3 
        And B.D3 Is Not Null 
       )   
Where A.C4 = 10 
    And Exists (
       Select 1 
       From B 
       Where B.D1 = A.C2 
        And B.D2 = A.C3 
        And B.D3 Is Not Null 
       ) 
+0

太棒了!它完美的作品。非常感謝! – user713972 2011-04-19 13:51:09

0
UPDATE A 
SET C2 = (
    SELECT B.D3 
    FROM B 
    WHERE A.C2 = B.D1 AND A.C3 = B.D2) 
WHERE A.C4=10 
    AND EXISTS (
    SELECT * 
    FROM B2 
    WHERE A.C2 = B2.D1 AND A.C3 = B2.D2) 

無需更新語句的別名。此外,您還有B.D2 <> ' 'A.C3 = B.D2的條件,因此只需在A.C3 <> ' '上過濾即可,因爲A是目標表。如果A.C3從不空白,那麼甚至不需要該條件。

+0

我編輯了我的問題。 – user713972 2011-04-19 02:01:13

+0

因爲我A.C3不會爲空值,因爲它們都有值。 – user713972 2011-04-19 02:36:35

+0

而且我確實運行了這個更新,但有錯誤表示無法將A.C2更新爲空值。 – user713972 2011-04-19 02:37:20

1

你不能使用更新語句像...

UPDATE A 
    set c2 = (select D3 
       from B 
       where B.D2 <> ' ' and 
        A.C2 = b.D1 and A.C3=B.D2) 
      ) 
    where A.C4=10 

而且,你的問題和問題說明本身看起來像一個謎thtis很難理解。

你可以張貼一些數據和CREATE TABLE語句,這樣很容易複製你的情況?(也許從下一次....)

+0

我不能這樣更新,因爲表A有比B更多的記錄。所以我會因嘗試將C2更新爲Null值而出錯。 – user713972 2011-04-19 02:00:37

+0

你也可以添加你的表B數據(如創建表和插入語句)?想一下就好像你在回答問題一樣。除非試圖回答的人寫入create table和insert語句,否則幾乎不可能重現你的情況。 – 2011-04-19 02:13:29