【问题标题】:The database reported a syntax error: Duplicate column name 'Product_Number'数据库报告语法错误:Duplicate column name 'Product_Number'
【发布时间】:2020-06-25 19:12:04
【问题描述】:

说数据库报了语法错误:

列名“Product_Number”重复。

下面是代码:

SELECT * 
FROM `df_all_orders_merged_la` 
LEFT JOIN `product_database_la` 
    ON `df_all_orders_merged_la`.`Product_Number` = `product_database_la`.`Product_Number`
WHERE `product_database_la`.`Product_Number` IS NULL;

【问题讨论】:

  • 尝试准确选择您需要的字段而不是*。例如SELECT df_all_orders_merged_la.*
  • @SlavaRozhnev 您告诉“确切字段”,但仍使用星号。 ???

标签: mysql domo


【解决方案1】:

如果df_all_orders_merged_laproduct_database_la 都包含名为product_number 的列,则会出现此错误。

您需要做的是消除您的请求,在这个重写的查询中使用表别名(例如字母pm):

 SELECT m.* 
 FROM `df_all_orders_merged_la` m
   LEFT JOIN `product_database_la` p
ON m.`Product_Number` = p.`Product_Number`
WHERE p.`Product_Number` IS NULL;

在这里,我使用了pm 字母来指代FROMJOIN 部分中的特定表格。还要注意我对SELECT 子句所做的事情:我不再从表p 中提取任何内容。 (但我这样做只是为了摆脱直接的歧义......)

一般来说,我建议您指定结果中实际需要的字段,而不是依赖SELECT * 的多种形式。 文档,在查询中,你真正需要哪些列,它们来自哪些表:

 SELECT m.order_id, p.product_number, p.product_name [...]

【讨论】:

    【解决方案2】:

    实际上,您正在加入该表,并且在两个父表中的 Product_Number 列的基础上形成了一个新的临时表,因此在新表中将形成两个重复的列。

    现在,由于您正在调用 select * from ... ,由于 * 在 select 查询中,mysql 不知道您要选择哪个特定 Product_Number 列,因为在这个新表中有两个相同名称的列对它没有任何意义规范(如您想查看哪个父表的 Product_Name),因为 astrick(*) 将查询中的 * 替换为指定表中的所有列名(不指定任何父表,并且有时在连接的情况下会出现问题)/是具有相同名称但不同父表的列名)。

    想想如果你只是按列名调用,mysql如何知道它应该显示哪个父表列,因为名称可以相同,但内容可能不同或只是不同的顺序,它可以'不可能通过这种方式知道您想要哪个特定类型的列。也许它会在重复项中显示一些随机列,但您想要其他一些具有相同名称的列!

    所以在这种情况下选择的方法是通过列名指定所有唯一列的名称(您也可以指定父表,但没关系)而不指定父表和重复列将不得不打电话给

    select `df_all_orders_merged_la`.`Product_Number,`product_database_la`.`Product_Number` from (... your join query here ...);
    

    即指定要显示的列的父表,如上所示,再次为方便起见,您可以为父表指定别名

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-27
      • 2014-03-19
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 2013-11-28
      • 1970-01-01
      相关资源
      最近更新 更多