2017-08-23 158 views
2

讓我們說我有很多列兩個表,所以我不希望我的查詢中明確命名的列名,但我想避免重名。SELECT * FROM具有相同的列名的兩個表的MySQL

如果我做的:

CREATE TABLE new_table 
    SELECT a.*, b.* 
    FROM table1 a 
    INNER JOIN table2 b ON a.myID = b.myId 
    WHERE a.age > 10 and b.ice = 'melted' 

我會得到一個錯誤說:duplicate column name myId,我也得到更多的錯誤,如果A和B更列名是相同的。 。

我如何通過在*和b自動添加前綴的所有列名來避免此問題* W/O明確提到的所有列名 - 非常繁瑣這樣做!

謝謝!

+1

你必須你的別名列,OP,這意味着寫出來。也許你可以想出一個非常快捷的方式,用兩個表之間的逗號來列出兩個表中的所有列? – JNevill

+2

無論如何,它被認爲是一個糟糕的(即使相當普遍的)練習用'SELECT *'選擇;它會向您提供各種問題(例如,在隨後將這些列添加到所使用的表中的一個表中時,這會「隨機」使用沒有共用列名的表中斷公共查詢)。 _...以及任何半面體查詢編輯器都應該能夠吐出列列表以便爲您節省打字時間。@ – Uueerdo

+0

@Uueerdo年輕的編碼人員會記住這是計算機爲計算機工作而不是爲人類工作的時間......但是是有道理的。當你有100列的時候,這會成爲一個不太理想的方式去做事情。我很容易想象一個世界,在這個世界中,SQL語言可以理解這種類型的查詢併爲每個列名添加前綴 – Dnaiel

回答

1

以我的經驗奧姆斯將運行初始DESCRIBE查詢,以便它可以做一旦它有列名稱,這種東西適合你。但是,如果你堅持在一個查詢動態做這件事,你可以用純的MySQL這樣做:

-- config 
SET @database = 'your_database'; 
SET @tableA = 'table1'; 
SET @tableB = 'table2'; 

-- table alias "a" columns 
SET @fieldsA = NULL; 
SELECT GROUP_CONCAT(CONCAT('a.', COLUMN_NAME), ' AS ',CONCAT('`a.', COLUMN_NAME,'`')) INTO @fieldsA 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = @database AND TABLE_NAME = @tableA; 

-- table alias "b" columns 
SET @fieldsB = NULL; 
SELECT GROUP_CONCAT(CONCAT('b.', COLUMN_NAME), ' AS ',CONCAT('`b.', COLUMN_NAME,'`')) INTO @fieldsB 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = @database AND TABLE_NAME = @tableB; 

-- some variables for readability 
SET @fields = CONCAT(' ', @fieldsA, ',', @fieldsB,' '); 
SET @tableAliasA = CONCAT(' ',@database, '.', @tableA,' a '); 
SET @tableAliasB = CONCAT(' ',@database, '.', @tableB,' b '); 


-- generate our final query 
SET @query = CONCAT('CREATE TABLE new_table SELECT', @fields, 
        'FROM', @tableAliasA, 
        'INNER JOIN', @tableAliasB, 
        'ON a.myID = b.myId WHERE a.age > 10 and b.ice = ''melted'''); 

-- finally run the query: 
PREPARE stmt1 FROM @query; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

-- if you have problems with the above query, uncomment the following to get the query so you can run it separately 
-- SELECT @query; 

我強烈建議不要使用這種解決方案雖然。我會盡早運行一個初始的DESCRIBE查詢,然後根據它生成查詢。另一種解決方案是創建一個臨時表作爲第二表的副本,然後重命名有問題的欄目,然後繼續加入它來產生您需要創建NEW_TABLE數據。 MySQL對於具有相同名稱的結果列沒有任何問題,這裏的問題是試圖創建一個具有兩個具有相同名稱的列的表。所以基本上你想要做的是明星選擇,但不包括列。

另一種方法是僅從兩個選項中選擇主鍵:
SELECT a.myID as `aId`, b.myId as `bId`然後創建僅包含該表的表。然後,如果您需要某個特定表格的數據,只需加入它即可獲取您要查找的信息。你可以更進一步,並建立一個視圖爲你做這種事情。視圖可以爲您連接表格,並可以非常輕鬆地選擇您要查找的任何列。您也可以設置多個視圖。還要注意,視圖的行爲就像連接目的的表一樣。您可以使用表格加入視圖,或者您可以加入視圖等。

因此,而不是做你正在嘗試做的事 - 用另外兩個表中的數據創建一個新表 - - 考慮你是否真的在尋找VIEW

3

不幸的是,你將不得不列出情況表有列名匹配的列。但是,您可以使用information_schema得到的列名,格式和那些在查詢中複製粘貼保存疼痛,例如:

SELECT GROUP_CONCAT(CONCAT('a.', COLUMN_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'schema' AND TABLE_NAME = 'table'; 

上面的查詢應該給你逗號,a.前綴分隔的列名。然後,您可以對錶b使用相同的查詢,將名稱取出並在主要的SELECT查詢中使用它。

更新

由於@Uueerdo說得好,你可以添加別名欄爲好,如:

SELECT GROUP_CONCAT(CONCAT('a.', COLUMN_NAME, ' AS a_', COLUMN_NAME)) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'schema' AND TABLE_NAME = 'table'; 
+3

我想說如果你打算做這樣的事情,可以進一步做一下,並做'GROUP_CONCAT(CONCAT('a。',COLUMN_NAME,'AS a_',COLUMN_NAME))' – Uueerdo

+0

@darshan有沒有辦法在一個單一的嵌套查詢中做到這一點,以實現最終目標? – Dnaiel

+0

@Uueerdo更新了答案感謝您的輸入.. –

相關問題