select * from tableA as AA join tableB as BB;
有表中有許多相同的列,所以我希望所有的列來對錶的別名輸出前綴。像:AA.id,...,BB.id,...
我該怎麼做?
編輯:我知道我可以手動命名列,但是我希望所有這些都可以在表別名後自動命名。
感謝
select * from tableA as AA join tableB as BB;
有表中有許多相同的列,所以我希望所有的列來對錶的別名輸出前綴。像:AA.id,...,BB.id,...
我該怎麼做?
編輯:我知道我可以手動命名列,但是我希望所有這些都可以在表別名後自動命名。
感謝
您可以使用:
忽略笛卡爾乘積,這將產生在MySQL,它不會緩解這樣一個事實,即您將無法從任一表中的同名列中檢索值。 SELECT *
也是不好的做法,冒着你不需要的數據檢索的風險。
您必須爲相同名稱的列定義列別名,或者更改表格以更改列名稱。
創建列名的別名也。當然,你必須提到你想要輸出的每個列名,而不是*
,這裏沒有自動化版本。
select AA.colname as AA_colname, BB.colname as BB_colname
from tableA as AA join tableB as BB;
select *
是「懶惰」。您應該始終指定您想要的字段,並且如果兩個表之間存在衝突,則必須明確指定您想要的哪些衝突字段以及哪個表。
是的,這是繁瑣的,特別是如果你希望所有的領域,但這就是生活......
動態命名列的最簡單方法是生成一個引用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限制。