避免“#1060 - 重复列名”错误,但仍使用SELECT *

时间:2014-02-18 23:10:18

标签: mysql sql view key

我有2个表格,广告客户和广告系列。两者都有我需要列出的更多字段,并且都有一个主键“id”。我想创建一个视图,而不必使用*手动输入所有字段。我一直收到“重复列”错误。是否可以通过*完成此操作或是我唯一的选择输入所有列名称和设置ID的别名?

  CREATE VIEW VIEW_CAMPAIGNS AS 

  SELECT *, 
      advertisers.id as adv_id,
      campaigns.id as camp_id

  FROM  campaigns, advertisers
  WHERE advertisers.id = advertiser_id

仍然返回#1060 - 重复列名'id'

2 个答案:

答案 0 :(得分:8)

您可以使用using形式join代替on子句在MySQL(和其他标准数据库)中执行此操作。

不幸的是,您可以在此处执行此操作,因为连接键在两个表中具有不同的ID。如果它们具有相同的名称,您只需执行以下操作:

创建视图VIEW_CAMPAIGNS AS       选择 *,       来自广告系列c加入             广告商             使用(advertisers_id);

你最接近的是选择较大的表格,然后使用*,然后列出另一个表格的所有列。

或者,更好的是,只需使用information_schame.columns表来生成列名。类似的东西:

select (case when column_name = 'id' and table_name = 'campaigns' then `c.campaign_id`
             when column_name = 'id' and table_name = 'advertisers' then 'a.advertiser_id'
             when table_name = 'campaigns' then concat('c.', column_name)
             when table_name = 'advertisers' then concat('a.', column_name)
        end) as column_name
from information_schema.columns
where table_name in ('campaigns, 'advertisers')

答案 1 :(得分:0)

你可以这样做

  CREATE VIEW VIEW_CAMPAIGNS AS 

  SELECT u.id AS u_id
       ....
  , u2.id AS u2_id

  FROM  campaigns u
  INNER JOIN advertisers u2
  ON u.id = u2.advertiser_id

然后它的自动列是不同的。

  • 用于提高性能:更好地使用您只需要的列而不使用*。不要每次都选择所有列(40)。

编辑:

别名可用于单个列。

您必须为每列添加别名

检查this answer