2011-04-26 59 views
1

我跑MYSQL:使加入的結果與列名攜帶表的別名

select * from tableA as AA join tableB as BB; 

有表中有許多相同的列,所以我希望所有的列來對錶的別名輸出前綴。像:AA.id,...,BB.id,...

我該怎麼做?

編輯:我知道我可以手動命名列,但是我希望所有這些都可以在表別名後自動命名。

感謝

回答

1

您可以使用:

​​

忽略笛卡爾乘積,這將產生在MySQL,它不會緩解這樣一個事實,即您將無法從任一表中的同名列中檢索值。 SELECT *也是不好的做法,冒着你不需要的數據檢索的風險。

您必須爲相同名稱的列定義列別名,或者更改表格以更改列名稱。

2

創建列名的別名也。當然,你必須提到你想要輸出的每個列名,而不是*,這裏沒有自動化版本。

select AA.colname as AA_colname, BB.colname as BB_colname 
from tableA as AA join tableB as BB; 
3

select *是「懶惰」。您應該始終指定您想要的字段,並且如果兩個表之間存在衝突,則必須明確指定您想要的哪些衝突字段以及哪個表。

是的,這是繁瑣的,特別是如果你希望所有的領域,但這就是生活......

0

動態命名列的最簡單方法是生成一個引用information_schema的預處理語句。這會給你你想要的結果。

SET @sql = NULL; 
SELECT CONCAT('SELECT ',GROUP_CONCAT(c.TABLE_NAME,'.',c.COLUMN_NAME, 
    ' ''',t.TABLE_COMMENT,'.',c.COLUMN_NAME,''''),' FROM tableA JOIN tableB;') 
INTO @sql 
FROM INFORMATION_SCHEMA.COLUMNS c JOIN INFORMATION_SCHEMA.TABLES t 
ON c.TABLE_NAME = t.TABLE_NAME 
WHERE c.TABLE_NAME IN ('tableA','tableB'); 
PREPARE sql_statement FROM @sql; 
EXECUTE sql_statement; 

沒有AA,BB別名更簡單。上述方法要求您在INFORMATION_SCHEMA.TABLES.TABLE_COMMENT中的每個表的表註釋字段中設置它們。更新information_schema.tables設置table_comment ='AA'等...

GROUP_CONCAT()函數的默認限制爲1024個字符,因此取決於表中的列數,您可能需要提高此限制爲了生成準備好的語句。

SET SESSION group_concat_max_len = 1000000; 

如果需要,該命令將提高集團CONCAT限制。