问题描述
我一直试图连接两个临时表,但是即使使用列别名,我仍然收到一条错误消息“ Ambiguous column name”。仅供参考,这是sql Server编程。
select ID,count(PageNum) as Frequency
into temp_list
from ID_USA
group by ID
select ID,ISNULL(PageNum1,'') +','+ISNULL(PageNum2,'+ISNULL(PageNum3,'+ISNULL(PageNum4,'+ISNULL(PageNum5,'') As PageNum
from temp_table k
left join temp_list c on c.ID = k.ID
有人可以帮忙吗?谢谢。
解决方法
两个表中都存在列id
,因此查询中不合格的id
含糊不清-您在select
子句中有此列。
考虑为该列添加表别名-由于您有left join
,因此我选择了左表:
select k.ID,concat_ws(',',c.pageNum1,c.PageNum2,c.pageNum3,c.pageNum4,c.pageNum5) As PageNum
from temp_table k
left join temp_list c on c.ID = k.ID
基于所有pageNum
列都来自正确表的假设,我也为其添加了前缀。
请注意,我将+
字符串的连接更改为concat_ws()
:尽管这与原始表达式完全不同,但已经足够接近了(很多更简洁)值得一提。
首先,没有理由至少在第一次查询时就使用临时表。
第二,正如GMB所指出的,您需要合格的列名。
第三,您可以使用concat()
函数更简单地精确复制逻辑(因为concat()
忽略NULL
值)。
所以,我建议:
with temp_list as (
select ID,count(PageNum) as Frequency
from ID_USA
group by ID
)
select k.ID,concat(c.PageNum1,c.PageNum3,c.PageNum4,c.PageNum5) as PageNum
from temp_table k left join
temp_list c
on c.ID = k.ID;
请注意,查询中的每个列引用都以表别名开头。这样的合格列引用永远不会模棱两可。
当然,如果您出于其他原因需要保留temp_list
,则可以保留。但是您不需要此查询的临时表。