【问题标题】:Can't join two temp tables无法加入两个临时表
【发布时间】:2020-09-19 02:11:45
【问题描述】:

我一直在尝试加入两个临时表,但即使我使用了列别名,我仍不断收到一条错误消息“列名不明确”。仅供参考,这是 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

错误消息显示 Ambiguous column name 'ID'。

有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: sql sql-server string left-join sql-null


    【解决方案1】:

    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():虽然这与您的原始表达式完全做相同的事情,但这足够接近(并且更简洁)值得推荐。

    【讨论】:

      【解决方案2】:

      首先,没有理由使用临时表,至少对于第一个查询。

      其次,正如 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.PageNum2, ',', c.PageNum3, ',', c.PageNum4, ',', c.PageNum5) as PageNum
      from temp_table k left join
           temp_list c
           on c.ID = k.ID;
      

      请注意,查询中的每个列引用都以表别名开头。这样的合格列引用绝不是模棱两可的。

      当然,如果您因其他原因需要,可以保留temp_list。但您不需要用于此查询的临时表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-20
        • 2016-07-22
        • 2018-05-19
        • 2012-05-24
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多