以我的经验奥姆斯将运行初始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。
你必须你的别名列,OP,这意味着写出来。也许你可以想出一个非常快捷的方式,用两个表之间的逗号来列出两个表中的所有列? – JNevill
无论如何,它被认为是一个糟糕的(即使相当普遍的)练习用'SELECT *'选择;它会向您提供各种问题(例如,在随后将这些列添加到所使用的表中的一个表中时,这会“随机”使用没有共用列名的表中断公共查询)。 _...以及任何半面体查询编辑器都应该能够吐出列列表以便为您节省打字时间。@ – Uueerdo
@Uueerdo年轻的编码人员会记住这是计算机为计算机工作而不是为人类工作的时间......但是是有道理的。当你有100列的时候,这会成为一个不太理想的方式去做事情。我很容易想象一个世界,在这个世界中,SQL语言可以理解这种类型的查询并为每个列名添加前缀 – Dnaiel