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()?
您不能在WHERE
子句中使用列别名。
将其更改为:
where
CampaignCustomer.CampaignCallStatusID = 21
and convert(varchar, CampaignCustomer.ModifiedDate, 111) = '2011/11/22'
+1尽管如此,这仍然是可怕的不可讨论的。最好只是使用'CampaignCustomer.ModifiedDate> ='20111122'和CampaignCustomer.ModifiedDate
是的,我不喜欢比较日期类型与字符串类型。将会使用'DAY(CampaignCustomer.ModifiedDate)= DAY(22)和MONTH(CampaignCustomer.ModifiedDate)= MONTH(11)AND YEAR(CampaignCustomer.ModifiedDate)= YEAR(2011)'更好用吗?或者在性能方面同样不好? – Curt
同样糟糕。如果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中的设置 - 它可能适用于您,但我敢打赌别人,它会打破....
这不是我自己的服务器,但它是SQL Server 2005 :( – Behrens
[在Where子句中使用别名或一个替代选项?](http://stackoverflow.com/questions/7705470/using-aliases-in-where-clause-or-an-alternative-option) –