2014-09-04 51 views
1

我有這樣一個查詢(在現實中更多的列)集團通過聲明列名稱解析

select 
    custom_amend_column_function(colname) as colname 
from source_table 
group by colname 

我用這個構造lot.It似乎一直使用從該函數的輸出,而不是輸入來按數據分組數據。 現在,第一次,今天我已經直接運行該語句到一個新表是這樣的:

create table new_table as 
select 
    custom_amend_column_function(colname) as colname 
from source_table 
group by colname 

奇怪的是,加入的第一行,我得到我的查詢使用曖昧列名稱的錯誤信息集團聲明。

由於group by可以使用新的列名(即下面的工作),我總是期望group by將首先使用select語句中定義的列,然後查看基礎表(如果找不到名。

select 
    custom_amend_column_function(colname) as new_colname 
from source_table 
group by new_colname 

對嗎?錯誤信息是否正確?我無法找到任何有關SQL標準或MySQL的文檔。

我知道我可以通過創建一個新的列名來避免這種情況,但是我想知道這一點,因爲如果確實含糊不清,可能需要查看現有查詢。

+0

這是不正確的。 'CREATE TABLE .. AS'通常只使用查詢結果。一旦成功,創作就會完成。更多的,在你的情況下,「GROUP BY」將使用__original column__來對該函數的數據和__not__輸出進行分組。證明:[for 5.6](http://sqlfiddle.com/#!9/e663c/1); [for 5.5](http://sqlfiddle.com/#!2/e663c/1); [對於5.1](http://sqlfiddle.com/#!8/e663c/1) - 正如你所看到的,它對DDL和名稱解析都能正常工作,這將由原始列執行(因爲我們可能會看到多行爲相同的功能輸出,但不同的原始值) – 2014-09-04 10:30:47

+0

正如我在問題中說我*從未驗證*如果分組的結果是基於表列或查詢輸出,但做了一個假設。在查詢開始處添加'create table [table_name] as'明確地向查詢添加了一個警告,表明列定義不明確。如果後者確實如此......。 1)爲什麼只有在創建表時而不是在運行select時纔會出現此警告2)是否在任何位置記錄了表列與查詢列的優先級? – Hans 2014-09-04 12:33:16

回答

2

追查問題做一個

EXPLAIN EXTENDED SELECT ... 

您的查詢。除了正常的輸出,這會給你一個包含查詢的警告,就像優化器看到的一樣。所有隱式重命名都在這裏完成,所以你可以看到爲什麼列名不明確。

我想你可以說

... GROUP BY 1 

,而不是由集團提供的列名解決這個問題。