SQL别名给出无效的列名

问题描述:

使用以下SQL表达式,但出现错误。SQL别名给出无效的列名

select 
    CampaignCustomer.CampaignCustomerID, 
    convert(varchar, CampaignCustomer.ModifiedDate, 111) as startdate, 
    CampaignCustomer.CampaignID, 
    CampaignCustomer.CampaignCallStatusID, 
    CampaignCustomer.UserID, 
    CampaignCustomerSale.Value, 
    Users.Name 
from CampaignCustomer 
    inner join CampaignCustomerSale 
    on CampaignCustomer.CampaignCustomerID = CampaignCustomerSale.CampaignCustomerID 
    inner join Users 
    on CampaignCustomer.UserID = Users.UserID 
where 
    CampaignCustomer.CampaignCallStatusID = 21 
    and CampaignCustomer.startdate = '2011/11/22'  <------- THIS 
order by 
    startdate desc, 
    Users.Name asc 

错误:

Msg 207, Level 16, State 1, Line 1
Invalid column name 'startdate'.

我不能在WHERE子句中认识我的别名startdate,但它可以在我ORDER BY条款。怎么了?

编辑:
没有,它是不可能对我来说,数据类型更改为date而不是datetime。时间需要在别处。但在这种情况下,我只需要获得特定日期的所有帖子,我真的不在乎modifieddate是什么时间的日期:)

也许需要另一种方法,而不是convert()?

+0

[在Where子句中使用别名或一个替代选项?](http://stackoverflow.com/questions/7705470/using-aliases-in-where-clause-or-an-alternative-option) –

您不能在WHERE子句中使用列别名。


将其更改为:

where 
    CampaignCustomer.CampaignCallStatusID = 21 
    and convert(varchar, CampaignCustomer.ModifiedDate, 111) = '2011/11/22' 
+0

+1尽管如此,这仍然是可怕的不可讨论的。最好只是使用'CampaignCustomer.ModifiedDate> ='20111122'和CampaignCustomer.ModifiedDate

+0

是的,我不喜欢比较日期类型与字符串类型。将会使用'DAY(CampaignCustomer.ModifiedDate)= DAY(22)和MONTH(CampaignCustomer.ModifiedDate)= MONTH(11)AND YEAR(CampaignCustomer.ModifiedDate)= YEAR(2011)'更好用吗?或者在性能方面同样不好? – Curt

+0

同样糟糕。如果OP位于SQL Server 2008上,那么'CAST(CampaignCustomer.ModifiedDate AS DATE)='20111122'* *是* sargable。优化器对这种情况有特殊的逻辑。 –

这样做:

select 
    CampaignCustomer.CampaignCustomerID, 
    convert(varchar, CampaignCustomer.ModifiedDate, 111) as startdate, 
    CampaignCustomer.CampaignID, 
    CampaignCustomer.CampaignCallStatusID, 
    CampaignCustomer.UserID, 
    CampaignCustomerSale.Value, 
    Users.Name 
from CampaignCustomer 
    inner join CampaignCustomerSale 
    on CampaignCustomer.CampaignCustomerID = CampaignCustomerSale.CampaignCustomerID 
    inner join Users 
    on CampaignCustomer.UserID = Users.UserID 
where 
    CampaignCustomer.CampaignCallStatusID = 21 
    and convert(varchar, CampaignCustomer.ModifiedDate, 111) = '2011/11/22' 
order by 
    startdate desc, 
    Users.Name asc 

你需要把你的where子句中没有别名,并在上面的查询我代替你的别名是什么它代表。

你没有提到什么样的SQL Server你使用版本 - 但如果你是在2008年或更新版本,你可以使用:

where 
    CampaignCustomer.CampaignCallStatusID = 21 
    and CAST(CampaignCustomer.ModifiedDate AS DATE) = '20111122' 

你可以将它转换为一个DATE - 只是为了这个比较。

另外:我建议总是使用表示日期的ISO-8601标准格式,如果你需要一个日期比较字符串 - ISO-8601定义的日期为YYYYMMDD,是在SQL Server中的唯一格式无论您使用哪种语言/区域设置,这都将始终有效。日期的任何其他字符串表示总是受到您的SQL Server中的设置 - 它可能适用于您,但我敢打赌别人,它会打破....

+0

这不是我自己的服务器,但它是SQL Server 2005 :( – Behrens