2017-07-13 16 views
1

我正在嘗試使用CREATE Table AS SELECT語句創建表。在SELECT語句中,目前有大量表(超過10個)的連接。當使用create table作爲select時避免重複的列名稱

CREATE TABLE table_name AS 
    SELECT 
    * 
    FROM 
    table_x x 
    LEFT JOIN 
    table_y y 
    on x.id=y.fid 
    LEFT JOIN 
    table_z z 
    on x.id=z.fid 
    ... 
    ... 
    ... 

由於許多表共享列名(儘管不是數據),我得到一個重複的列名錯誤。

我想知道是否有一種懶惰的方式來生成列名,所以沒有衝突。例如,在上面的示例中,table_ytable_z都具有名爲fid的列。

我想知道是否有產生所謂的y.idz.id,或類似的東西列的方式(例如y_idz_id),而不是僅僅id並在新表id

我想避免編寫查詢,我必須顯式地寫出來的所有列在選擇,和我們AS聲明如下:

CREATE TABLE table_name AS 
    SELECT 
    x.id as x_id, 
    y.fid as y_fid, 
    z.fid as z_fid, 
    ... 
    ... 
    ... 
    FROM 
    table_x x 
    LEFT JOIN 
    table_y y 
    on x.id=y.fid 
    LEFT JOIN 
    table_z z 
    on x.id=z.fid 
    ... 
    ... 
    ... 
+2

無論如何,最好的做法是寫出列名,因爲這樣可以防止其他查詢,函數和過程在底層表結構更改時發生中斷,並且使腳本更易於維護 - 如果新開發人員必須做出一些更改,如果在腳本中陳述了什麼,則有更好的機會知道正在被拉入什麼位置。您甚至可能會發現在新表中不需要某些列,因此您不需要選擇它們 – MarkD

+0

本練習的一部分內容是對多個表中記錄的數據進行完整性檢查,因此對我們在每個列的前面添加每個表的標識符。我完全理解我將在用於加入的列之間重複值,但是,這不會在生產環境中使用,並且重複的內容不會成爲此用例的主要擔心。 – jonhurlock

回答

-1

也許,我失去了一些東西,但爲什麼你想選擇基本上具有相同值的列嗎?

相反的:

SELECT x.id as x_id, y.fid as y_fid, z.fid as z_fid, . . . 

爲什麼不?

SELECT x.id as x_id, . . . 

是否有一個原因,你會想要NULL值?我可以想象標誌表明比賽是否真的發生,但沒有理由僅僅因爲他們在那裏而包括所有列。

+0

該練習的目的是對數據進行健全性檢查,同時也將數據非規範化(在多個表格中放入一個表格),然後根據非規格化數據創建多個視圖。提高查詢速度並降低SQL的複雜性。 – jonhurlock

+0

還有其他的列由於連接而沒有重複,但是,在表中有超過100個非重複列,因此不需要顯式手動將每個列名寫出來。在select語句中,這些列名稱中的一部分即使表示不同的數據也會發生衝突。因此,在列的前面加上表格是很有用的。 – jonhurlock