2017-02-28 31 views
2

SQL新手,並有一個關於一個非常基本的聯合所有語句的一般問題。我正在看一塊看起來像這樣的代碼:基本SQL聯合所有作爲tmp

select * 
into ConsolidatedTable 
from 
    (select * from Table1 
    union all 
    select * from Table2 
    union all 
    select * from Table3) as tmp; 

是否需要'as tmp'?如果是這樣,爲什麼?

謝謝!

+0

這是一個別名。你可以給你選擇的任何名稱..它可以是戴夫也..但你應該給別名肯定 –

+0

謝謝Shakeer,但它是必要的嗎?如果'tmp'不在那裏會發生什麼? – Dave

+0

將會拋出一個錯誤'附近語法不正確')' –

回答

2

對於SQL Server,是的,對於內聯視圖,別名是要求。如果別名被省略,SQL Server將引發錯誤。

別名之前的AS關鍵字是可選的,並且不是必需的。

(我的個人偏好是省略用於表/圖別名AS關鍵字,並且總是包括用於列別名的AS關鍵字。)


AS關鍵字爲表/圖別名是可選在SQL Server中。 (它不是ANSI SQL標準的一部分。)有些數據庫(如Oracle)在表或視圖別名之前不接受AS關鍵字,並且如果包含該關鍵字,則會引發錯誤。

某些數據庫(如MySQL和SQL Server )要求將別名分配給內聯視圖。執行而不是的數據庫要求內聯視圖(例如Oracle)上的別名允許使用別名,並且指定別名可以使我們限定外部查詢中的列引用。由於符合條件的列引用是我們的正常模式,因此爲內聯視圖分配別名也是我們的正常模式,即使對於不需要數據庫的數據庫也是如此。

請注意,在內聯視圖查詢中,別名的分配是無關的UNION ALL的使用。

+0

知道了,所以最後一行代碼可能很簡單:select * from Table3)tmp? – Dave

+0

@不錯,確切地說。 SQL Server,Oracle,MySQL等一貫遵循這種模式。 – spencer7593

1

tmp被稱爲別名。這是強制性的,因爲否則,內聯視圖中的列(所有包含在parantheses中的代碼)將在查詢的其餘部分變得「無法訪問」,因爲您無法引用它們。

它可以有任何你想要的名字,它只用於進一步的參考。

而且,要回答你最後的問題,是否有必要有'as tmp'? - 因爲這是sql服務器,所以你可以直接寫別名而不用'as' - 所以) tmp就足夠了。

+0

謝謝!非常明確的解釋。 – Dave