2011-09-21 50 views
1

SQL更新與我在用的Oracle 11g以下更新查詢問題subsubquery

update TABLE_A a set COL1 = 
    (SELECT b.COL2 FROM 
    (SELECT ROWNUM AS ROW_NUMBER, b.COL2 from TABLE_B b where COL3 = a.COL4) 
    WHERE ROW_NUMBER = 2 
) 

ORA-00904: 「A」 「COL4」:無效的ID。

因此,a.COL4在子查詢中是未知的,但我不知道如何解決這個問題。

/編輯。我想做什麼?

TABLE_B中的每條記錄都有多條記錄。然而,來自客戶的新需求:TABLE_A將獲得2個新列,而TABLE_B將被刪除。因此,子查詢的第一個記錄的表示將寫入第一個新字段,第二個記錄也會寫入相同的記錄。第一個記錄是容易的,因爲邁克C'S解決方案可與ROW_NUMBER = 1

實例行中:

TABLE_A 

| col0 | col1 | col2 | col3 | col4 | 
------------------------------------ 
|  |  |dummy2|dummy3| 1 | 
------------------------------------ 
|  |  |dummy4|dummy5| 2 | 
------------------------------------ 

TABLE_B 

| col1 | col2 | col3 | 
---------------------- 
| d |name1 | 1 | 
---------------------- 
| d |name2 | 1 | 
---------------------- 
| d |name3 | 1 | 
---------------------- 
| d |name4 | 2 | 
---------------------- 


TABLE_A after update 

| col0 | col1 | col2 | col3 | col4 | 
------------------------------------ 
| name1| name2|dummy2|dummy3| 1 | 
------------------------------------ 
| name4|  |dummy4|dummy5| 2 | 
------------------------------------ 
+0

什麼是「where row_number = 2」的目的?你想要做什麼? – tbone

+0

它在編輯中。需要將TABLE_B中前兩個記錄的表示匹配TABLE_A中兩個新字段中的字段。 – Cantillon

+0

好的,所以一個數據透視表,將tableB中的2行變成tableA中的2列?可以考慮通過CTAS連接2個表格來重新創建tableA。什麼是Oracle版本? – tbone

回答

0

我解決了這個問題,使用臨時表,從表中刪除數據,因爲表A被填充。

0

嘗試

update TABLE_A a set COL1 = 
    (SELECT b.COL2 FROM 
    (SELECT ROWNUM AS ROW_NUMBER, b.COL2 from TABLE_B b, TABLE_A a2 where b.COL3 = a2.COL4) 
    WHERE ROW_NUMBER = 2 
) 

我假設COL3來自B表,也你爲什麼要在子查詢中選擇ROWNUM?它只能從WHERE子句中獲得2。

+0

請參閱我對MikeG的回答。 – Cantillon

+0

啊,是的,看到rownum的問題。你究竟想要做什麼? – OTTA

0
UPDATE TABLE_A a SET COL1 = 
    (SELECT b.COL2 FROM 
    (SELECT ROWNUM AS ROW_NUMBER, b.COL2 FROM TABLE_B b, TABLE_A innerA WHERE COL3 = innerA.COL4) 
    WHERE ROW_NUMBER = 2 
) 
+0

內部選擇將返回比我原來的查詢中預期更多的記錄。而不是從TABLE_B返回匹配正在從TABLE_A更新的記錄的記錄,它將從TABLE_B返回匹配來自TABLE_A的任何記錄的記錄。 – Cantillon

+0

好的。如果您在原始問題中描述您試圖通過查詢實現的目標,可能會有所幫助。 –

0

你可以消除這樣的子查詢之一嗎?

update TABLE_A a set COL1 = 
(SELECT b.COL2 FROM TABLE_B b where COL3 = a.COL4 AND ROWNUM = 2) 
+0

不,請參閱http://stackoverflow.com/questions/6441329/problem-with-rownum – Cantillon

0

我覺得這可能是一個可能的解決您的問題,但根據數據量,你正在處理這可能是很慢,因爲是內部聲明沒有限制因素。

update 
    table_a upd 
set upd.col1 = (
    select 
    sub.col2 
    from 
    (
     select 
     rownum as row_number, 
     b.col2 as col2, 
     b.col3 as col3 
     from 
     table_a a, 
     table_b b 
     where b.col3 = a.col4 
    ) sub 
    where sub.row_number = 2 
    and sub.col3  = upd.col4 
)