2011-11-23 54 views
3

使用以下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) –

回答

8

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


將其更改爲:

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

+1儘管如此,這仍然是可怕的不可討論的。最好只是使用'CampaignCustomer.ModifiedDate> ='20111122'和CampaignCustomer.ModifiedDate <'20111123''來代替,並放棄重新使用該表達式的想法。 –

+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。優化器對這種情況有特殊的邏輯。 –

4

這樣做:

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子句中沒有別名,並在上面的查詢我代替你的別名是什麼它代表。

1

你沒有提到什麼樣的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