Sql 为什么我会得到;无效的列名";列存在时出错

Sql 为什么我会得到;无效的列名";列存在时出错,sql,sql-server,join,Sql,Sql Server,Join,这是我的代码: declare @maxsnap table (sita varchar(10), date date, SNAPSHOT_DATE date) insert into @maxsnap select sita, date, max(SNAPSHOT_DATE) snapshot from [UKRMC].[dbo].[Roll_forecast] where date between '2018-03-2

这是我的代码:

declare @maxsnap table (sita varchar(10), date date, SNAPSHOT_DATE date)

insert into @maxsnap 
   select 
       sita, date, max(SNAPSHOT_DATE) snapshot 
   from 
       [UKRMC].[dbo].[Roll_forecast] 
   where 
       date between '2018-03-21' and '2018-05-31'
   group by 
       sita, date 

select 
    roll.DATE, roll.SITA,
    contacts.rooms,
    roll.SEGMENT, roll.RNS 
from 
    [UKRMC].[dbo].[Roll_forecast] roll
join 
    [UKRMC].[dbo].[Contacts] contacts on contacts.SITA = roll.SITA
join 
    @maxsnap snap on roll.DATE = snap.date 
                  and roll.SITA = snap.sita 
                  and roll.SNAPSHOT_DATE = snap.snapshot
where 
    roll.date between '2018-03-21' and '2018-05-31' 
我得到的错误是

无效的列名“快照”


当我加入
@maxnsap
表变量时。但那个专栏确实存在

您有以下情况:

roll.DATE = snap.date
但是,该列称为
snapshot\u date

roll.DATE = snap.snapshot_date

您有以下情况:

roll.DATE = snap.date
但是,该列称为
snapshot\u date

roll.DATE = snap.snapshot_date
联接错误

     and roll.SNAPSHOT_DATE = snap.SNAPSHOT_DATE
联接错误

     and roll.SNAPSHOT_DATE = snap.SNAPSHOT_DATE

您的意思是
max(快照\u日期)作为快照
在您的
中选择
?@Forty3我已经尝试过了,但它仍然给我相同的结果error@maxsnap没有列
snapshot
,因此这不起作用
roll.snapshot\u DATE=snap.snapshot
抱歉-您使用名为
snapshot\u DATE
的列定义表
@maxsnap
快照
。因此,在最后的
选择
中,您需要参考
snap.SNAPSHOT\u DATE
yep@Forty3,您的意思是
max(SNAPSHOT\u DATE),它比medid解释得更好作为快照
在您的
中选择
?@Forty3我已经尝试过了,但它仍然给我相同的结果error@maxsnap没有列
snapshot
,因此这不起作用
roll.snapshot\u DATE=snap.snapshot
抱歉-您使用名为
snapshot\u DATE
的列定义表
@maxsnap
快照
。因此,在您的最后一次
选择中
您需要参考
snap.SNAPSHOT\u DATE
yep@Forty3对它的解释比我想象的要好,这很有效!但是,我将其称为“快照”,因此我不明白为什么需要引用原始列名@maxsnap表中的列称为snapshot\u DATE。在填充表的查询中,您使用了别名快照,但这不会更改表中列的名称table@Sorath对于尚未分配别名的编译器,您不能使用别名,如果您看到它解释了select语句的每个部分都是按优先顺序运行的,说明from是在SELECT之前完成的,该别名仅存在于初始的
插入中,甚至在那里它也被忽略。由于您没有指定列列表,它只是假设列的顺序与您创建表的顺序相同。谢谢,这很有效!但是,我将其称为“快照”,因此我不明白为什么需要引用原始列名@maxsnap表中的列称为snapshot\u DATE。在填充表的查询中,您使用了别名快照,但这不会更改表中列的名称table@Sorath对于尚未分配别名的编译器,您不能使用别名,如果您看到它解释了select语句的每个部分都是按优先顺序运行的,说明from是在SELECT之前完成的,该别名仅存在于初始的
插入中,甚至在那里它也被忽略。因为您没有指定列列表,所以它只是假设列的顺序与您创建表的顺序相同。