2011-11-02 79 views
1

我必須執行由某些用戶創建的SQL並顯示其結果。一個例子SQL中,可以是這樣的:使用rownums在子查詢中不明確定義的列

SELECT t1.*, t2.* FROM table1 t1, table2 t2, where table1.id = table2.id 

這個SQL工作得很好,因爲它是,但我需要手動添加分頁,並顯示了這個rownum,所以SQL結束了這個樣子。

SELECT z.* 
FROM(  
    SELECT y.*, ROWNUM rn 
    FROM (     
     SELECT t1.*, t2.* FROM table1 t1, table2 t2, where table1.id = table2.id 
    ) y  
    WHERE ROWNUM <= 50) z   
WHERE rn > 0 

這拋出異常:「ORA-00918:列定義的含糊」,因爲Table 1和表2都包含具有相同的名稱(「ID」)的字段。

什麼可能是避免這種情況的最好方法?

問候。

  • UPDATE

最後,我們不得不去爲醜陋的方式,並分析每個SQL執行之前到來。基本上,我們解決星號來發現我們需要添加哪些字段,並用唯一的ID來區別每個字段。這引入了性能損失,但我們的客戶明白這是滿足要求的唯一選擇。

我會標記Lex答案,因爲它是我們結束工作的解決方案。

+0

的可能重複的[ORA-00918:在SELECT \ *定義的含糊柱](http://stackoverflow.com/questions/6233086/ora-00918-column-ambiguously-defined-in-select) – Ben

+0

@Ben不幸的是,由於當時我的特殊要求使這些答案不可取。 – Damntry

回答

3

我認爲你必須爲(至少一個)table1.id和table2.id指定別名。也可能用於其他任何相應的列名。

所以不是SELECT t1.*, t2.* FROM table1 t1, table2使用類似:

SELECT t1.id t1id, t2.id t2id [rest of columns] FROM table1 t1, table2 t2 

我不熟悉Oracle的語法,但我想你會明白我的意思。

+0

謝謝Lex,它會解決它,但它不適用於我的情況。因爲我只是接收SQL,所以我不得不解析它,但是獲取*查詢的字段併爲每個字段設置別名會太多。我不能告訴用戶修復SQL,因爲它對他們來說工作正常。 – Damntry

+0

在這種情況下,也許可以避免使用y。*並從t1和t2指定所需的列名。也許如果你不指定它的ID列,它會起作用? (前提是你不需要ID列) –

+0

我需要顯示所有列,因爲它取決於用戶選擇包含的字段。 – Damntry

2

我正在尋找類似的答案。我引用了一個有兩個NULL列的別名子查詢。我必須爲NULL列別名,因爲我有不止一個;

選擇。*,t2.column,t2.column,t2.column (從t1 選擇t1.column,t1.column,NULL,NULL,t1.column其中t1 = 'VALUE')一個 在t2.column = t1.column上留下外部連接t2;

一旦我在子查詢中的NULL列別名,它工作正常。

1

如果你可以修改語法查詢(或讓用戶這樣做),使用顯式JOIN語法與USING條款,這將自動修復手頭的問題:

SELECT t1.*, t2.* 
FROM table1 t1 
JOIN table2 t2 USING (id) 

USING子句與ON t1.id = t2.id(或問題中隱含的JOIN)相同,只是結果中只有一個id列保留,從而消除了您的問題。

如果在USING子句中沒有包含名稱相同的更多列,則仍會遇到問題。 @Lex描述的別名是當時不可或缺的。

+0

的確,問題是我們需要與所有現有的SQL進行逆向兼容,並且該公司已經聲明,自從他們以前工作以來,他們不會改變它們。 由於我們正在從桌面客戶端遷移到完整的Web應用程序,並且需要分頁,因爲與之前使用的舊的普通網格控件相比,我們的組件的重量更重。 – Damntry

0

使用替換空值函數來解決這個問題。

SELECT z.* 
FROM(  
    SELECT y.*, ROWNUM rn 
    FROM (     
     SELECT t1.*, t2.* FROM table1 t1, table2 t2, where 

     NVL(table1.id,0) = NVL(table2.id,0) 

    ) y  
    WHERE ROWNUM <= 50) z   
WHERE rn > 0 
+0

謝謝@openritwanz,但那裏沒有null id列。錯誤發生是因爲檢索到重複名稱的列。這不能解決這個問題。 – Damntry

相關問題