【问题标题】:make sql subqueries stop complaining about duplicate columns使 sql 子查询停止抱怨重复列
【发布时间】:2011-11-22 14:19:26
【问题描述】:

所以假设我有这个查询

SELECT COUNT(*) FROM (SELECT * FROM k JOIN j ON k.id = j.aid) k 

假设 k 和 j 有两列同名,整个查询将报错列重复错误......

尽管有重复的列,但只需执行 SELECT * FROM k JOIN j ON k.id = j.aid 就可以正常执行......

我知道您可以在子查询中使用 USING 来指定在出现重复的情况下使用哪一列,但是有没有办法指定查询以便它自动绘制特定列(无论是随机还是使用任何规则) 在重复的情况下使用而无需我手动指定它们?

即在不修改子查询(SELECT * FROM k 等)的情况下执行此操作,仅修改超级查询(SELECT COUNT(*) FROM...)并使其尽可能抽象,以便无论使用什么子查询是

【问题讨论】:

  • 我同意@JoeStefanelli。使用SELECT * 不是最佳实践之一——即使有时您需要所有的列。但是,对手头的问题进行尝试。您是否尝试过SELECT COUNT(1) ...?您在列歧义上收到错误的一个原因是,当您将子查询包含在内并将其视为表时,您在某种程度上触发了规则的强制执行。类似于我们在创建新表时不能添加两个同名的列。我不确定如何让您的查询不以当前构建的方式抛出错误..

标签: php mysql sql


【解决方案1】:

没有。

此示例中最简单的解决方案是在子查询中将 * 替换为 1。单个字符的替换真的那么麻烦吗?

【讨论】:

    【解决方案2】:

    为什么不

     SELECT COUNT(*) FROM k JOIN j ON k.id = j.aid
    

    子查询中的重复列也发生在其他 RDBMS 中。

    就个人而言,为什么两个表中都有 id 列?不是孩子,吉德。对于每个表,这可能是 DRY 和 OO 思维,但对 SQL 完全没用。在"Why is naming a table's Primary Key column “Id” considered bad practice?"观看混战

    【讨论】:

    • 因为子查询中可能有分组依据,而 SELECT COUNT() 将改为按组执行 COUNT() 而不是总行数
    • @kamikaze_pilot:在那种情况下你不会有SELECT *,对吗?
    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 2023-04-06
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    相关资源
    最近更新 更多