【问题标题】:sql 2005 - The column was specified multiple timessql 2005 - 多次指定该列
【发布时间】:2009-06-29 14:23:41
【问题描述】:

尝试在 sql 2005 中运行此查询时出现以下错误:

    SELECT tb.*
    FROM (
        SELECT * 
        FROM vCodesWithPEs INNER JOIN vDeriveAvailabilityFromPE 
        ON vCodesWithPEs.PROD_PERM = vDeriveAvailabilityFromPE.PEID 
        INNER JOIN PE_PDP ON vCodesWithPEs.PROD_PERM = PE_PDP.PEID
    ) AS tb;

Error: The column 'PEID' was specified multiple times for 'tb'.

我是 sql 新手。提前感谢您的建议。

Eneo。

【问题讨论】:

  • 只是出于好奇,为什么你有外部的“select tb.*”?

标签: sql database


【解决方案1】:

如前所述,问题是您从两个表中选择 PEID,解决方案是指定您想要的 PEID,例如

 SELECT tb.*
    FROM (
        SELECT tb1.PEID,tb2.col1,tb2.col2,tb3.col3 --, and so on
        FROM vCodesWithPEs as tb1 INNER JOIN vDeriveAvailabilityFromPE as tb2
        ON tb1.PROD_PERM = tb2.PEID 
        INNER JOIN PE_PDP tb3 ON tb1.PROD_PERM = tb3.PEID
    ) AS tb;

除此之外,正如 Chris Lively 在评论中巧妙地指出的那样,外部 SELECT 完全是多余的。以下完全等同于第一种。

        SELECT tb1.PEID,tb2.col1,tb2.col2,tb3.col3 --, and so on
        FROM vCodesWithPEs as tb1 INNER JOIN vDeriveAvailabilityFromPE as tb2
        ON tb1.PROD_PERM = tb2.PEID 
        INNER JOIN PE_PDP tb3 ON tb1.PROD_PERM = tb3.PEID

甚至

        SELECT * 
        FROM vCodesWithPEs as tb1 INNER JOIN vDeriveAvailabilityFromPE as tb2
        ON tb1.PROD_PERM = tb2.PEID 
        INNER JOIN PE_PDP tb3 ON tb1.PROD_PERM = tb3.PEID

但请尽可能避免使用 SELECT *。当您进行交互式查询以节省输入时,它可能会起作用,但在生产代码中永远不要使用它。

【讨论】:

  • 当您需要所有列时使用 select * 很好 - 即使在生产中也是如此。在使用连接或复杂查询时应避免使用,而不是不惜一切代价避免,无论查询多么简单。
  • SELECT * 的问题在于表会随着时间的推移而演变,您可能会开始引入比预期更多的数据,而您并没有意识到这一点。此外,使用SELECT * 而不是使您感兴趣的字段显式化(除了输入的几个字符),您将一无所获。
  • 没错,很公平! :)
  • 我同意,应该避免使用select *。非常好的建议。
  • 这是正确的解决方案,对我来说效果很好
【解决方案2】:

看起来您在两个表中都有列 PEIDvDeriveAvailabilityFromPEPE_PDPSELECT 语句尝试选择两者,并给出关于重复列名的错误。

【讨论】:

  • 他确实在两个表中都有它,不仅看起来像:)
  • 你是对的,Vinko。 :-) 在旁注中:为什么我的第二个表名没有以斜体显示? (放入,但显示为PE_PDP)预览正确。
  • 我不知道,我认为是用户语音问题。我尝试了一些常用技巧(添加空格或重新格式化),但没有奏效
  • @MicSim 我猜斜体格式不喜欢名称 PE_PDP 中的下划线
【解决方案3】:

您正在连接三个表,并查看输出中的所有列 (*)。

看起来这些表有一个共同的列名 PEID,您必须将其别名为其他名称。

解决方案:不要在子查询中使用 *,而是显式选择您希望查看的每一列,为任何出现多次的列名设置别名。

【讨论】:

  • 别名!这就是我需要知道的!谢谢!
【解决方案4】:

不要使用 * 来标识收集所有字段,而是重写您的查询以明确命名您想要的列。这样就不会有混乱了。

【讨论】:

    【解决方案5】:

    只需为重复的列提供新的别名,它对我有用.....

    【讨论】:

    • 请考虑编辑您的答案,以详细说明您的解决方案为何有效。这将有助于 OP 以及将来遇到相同问题的任何人
    猜你喜欢
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多