尝试在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。
答案 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)
只为重复的列提供新的别名,它对我有用.....