2012-07-12 58 views
0

雖然這按預期工作:插入到太多的列通過SELECT查詢

 
SQL> DROP TABLE TEST1; 

Table dropped. 

SQL> CREATE TABLE TEST1 (COL1 INTEGER, COL2 INTEGER); 

Table created. 

SQL> INSERT WHEN 1=1 
    2 THEN INTO TEST1 (COL1, COL2) 
    3 SELECT 1, 0 FROM DUAL; 

1 row created. 

SQL> 

我收到一個奇怪的「ORA-00918:列定義的含糊」的錯誤嘗試這個擁有超過兩列:

 
SQL> DROP TABLE TEST1; 

Table dropped. 

SQL> CREATE TABLE TEST1(COL1 INTEGER, COL2 INTEGER, COL3 INTEGER); 

Table created. 

SQL> INSERT WHEN 1=1 
    2 THEN INTO TEST1 (COL1, COL2, COL3) 
    3 SELECT 1, 0, 0 FROM DUAL; 
THEN INTO TEST1 (COL1, COL2, COL3) 
      * 
ERROR at line 2: 
ORA-00918: column ambiguously defined 

SQL> 

爲什麼我在這裏收到ORA-00918錯誤?是否有限制多少列我可以在INSERT時選擇...然後INTO ... SELECT模式?

注意:我使用的是Oracle 11.2.0.1.0,而我試圖在生產中執行的實際查詢更爲複雜,並引用了其他表(並且使用「VALUES」不足)。這只是簡化的情況...

回答

2

使用別名:

SQL> CREATE TABLE TEST1(COL1 INTEGER, COL2 INTEGER, COL3 INTEGER); 

Table created. 

SQL> INSERT WHEN 1=1 
    2 THEN INTO TEST1 (COL1, COL2, COL3) 
    3 SELECT 1 "1", 0 "2", 0 "3" FROM DUAL; 

1 row created. 

你這個不明確的列錯誤是因爲當你不提供一個別名,Oracle將使用一組規則來命名每列的原因。在這種情況下,第二和第三列具有相同的名稱("0")並且因此不能由外部查詢明確地引用:執行語義分析時

SQL> SELECT 1, 0, 0 FROM DUAL; 

     1   0   0 
---------- ---------- ---------- 
     1   0   0 

Oracle不看數據值。

+0

+++謝謝您的解釋!這整個時間都沒有別名,現在這個效果非常好! – ManRow 2012-07-12 08:59:10

2

我沒有oracle與我,但它似乎是內聯查詢(SELECT FROM DUAL)這就是問題所在。我建議對該內嵌查詢中的所有字段進行別名並再次嘗試。

INSERT WHEN 1=1 
THEN INTO TEST1 (COL1, COL2, COL3) 
SELECT 1 AS c1, 0 AS c2, 0 AS c3 FROM DUAL; 
1

你用什麼使用這個?

INSERT WHEN 1=1 
THEN INTO TEST1 (COL1, COL2, COL3) 
SELECT 1 as col1, 0 as col2, 0 as col3 FROM DUAL;