sql 2005 - 多次指定列

时间:2009-06-29 14:23:42

标签: sql database

尝试在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。

5 个答案:

答案 0 :(得分:37)

如上所述,问题在于您从两个表中选择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 * 。当您进行交互式查询以节省输入时,它可能会起作用,但在生产代码中从不使用它。

答案 1 :(得分:4)

在两个表中看起来都有 PEID 列: vDeriveAvailabilityFromPE PE_PDP SELECT语句尝试同时选择两者,并提供有关重复列名的错误。

答案 2 :(得分:2)

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

看起来这些表有一个共同的列名PEID,你必须将别名作为别名。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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