从具有相同列名mySQL的两个表中选择*

时间:2017-08-23 16:25:54

标签: 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明确提及所有列名称 - 这非常繁琐!

谢谢!

2 个答案:

答案 0 :(得分:3)

不幸的是,您必须列出case表中具有匹配列名的列。但是,您可以使用pybot获取列名,格式化这些列并在查询中复制粘贴以节省痛苦,例如:

information_schema

上面的查询应该为您提供逗号分隔的列名称,其前缀为SELECT GROUP_CONCAT(CONCAT('a.', COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'schema' AND TABLE_NAME = 'table'; 。然后,您可以对表b使用相同的查询,获取名称并在主a.查询中使用它。

<强>更新

正如@Uueerdo所说,你也可以为列添加别名,例如:

SELECT

答案 1 :(得分:1)

根据我的经验,ORM会运行一个初始的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`然后创建仅包含该表的表。然后,如果您需要来自特定表的数据,只需LEFT JOIN就可以获取您正在寻找的信息。您可以更进一步,并设置一个VIEW来为您做这类事情。 VIEW可以为您连接表格,并且可以非常轻松地选择您要查找的列。您也可以设置多个VIEW。另请注意,为了连接,视图的行为与表类似。您可以使用表格加入视图,也可以使用视图等加入视图。

所以,不要做你想要做的事情 - 用其他两个表格中的数据创建一个新表格 - 考虑一下你是否真的在寻找VIEW