2016-09-21 20 views
3
SELECT users.first_name, users.last_name, users.email, 
(case 
     when user.AT_ST ='A' then 'Act' 
     when user.AT_ET = 'E' then 'Est' 
     end) as Act_Est 
FROM users LEFT OUTER JOIN locations 
ON users.id = locations.user_id 
WHERE Act_Est IN (' ') 

這裏這個別名想用在同一個查詢中,而不是用其他子查詢創建。 因爲如果我使用其他選擇子查詢,它會獲取第一個內部子查詢並首先檢索所有數據,然後應用where條件。在查詢中定義的列別名在SQL服務器中如何在相同的查詢中使用where子句

所以需要一些幫助。

+0

建議:如果您只打算處理「A」和「E」,然後在「WHERE」子句中過濾,則在CASE語句中使用ELSE。 – Arulkumar

+0

[SELECT語句的邏輯處理順序](https://msdn.microsoft.com/en-us/library/ms189499.aspx#Anchor_2):「...因爲SELECT子句是第8步,任何列別名或在該子句中定義的派生列不能被前面的子句引用「。 WHERE是第4步。 –

回答

2

使用with語句

;WITH T AS 
(
    SELECT 
     users.first_name, 
     users.last_name, 
     users.email, 
     (case when user.AT_ST ='A' then 'Act' when user.AT_ET = 'E' then 'Est' end) as Act_Est 
    FROM users 
    LEFT OUTER JOIN locations ON users.id = locations.user_id 
) 
SELECT 
    * 
FROM T 
WHERE T.Act_Est IN (' ') 

with語句是一個SELECT,INSERT,UPDATE,DELETE或CREATE VIEW語句

2

的執行範圍內定義的臨時結果集您可以使用一個更多的SELECT作爲以下:

SELECT 
    * 
FROM 
( 
    SELECT 
     users.first_name, 
     users.last_name, 
     users.email, 
     (case 
       when user.AT_ST ='A' then 'Act' 
       when user.AT_ET = 'E' then 'Est' 
       end) as Act_Est 
    FROM 
     users LEFT OUTER JOIN 
     locations ON users.id = locations.user_id 
) A 
WHERE 
    A.Act_Est IN (' ') 
0

要有中間變量爲f其他計算使用CROSS APPLY

SELECT users.first_name, users.last_name, users.email, vars.Act_Est 
FROM users 
CROSS APPLY (
    SELECT case 
     when users.AT_ST ='A' then 'Act' 
     when users.AT_ET = 'E' then 'Est' 
     end as Act_Est) vars 
LEFT OUTER JOIN locations 
ON users.id = locations.user_id 
WHERE vars.Act_Est IN (' ') 
+0

其實上述所有選項都需要更多時間來獲取結果。 – bvpk1234

+0

@ bvpk1234你能分享你的時間比較嗎?我的經驗是如上所述的內聯CROSS APPLY對性能幾乎沒有影響。 – Serg

0

其實上述所有選項都需要更多時間。

我的實際查詢如下所示。

When ( T.co in ('ps', 'pi', 'ri')) then ('PFG') 
    When (T.co in ('qs', 'qb')) then ('QBE') 
    When (T.co in ('sr')) then ('OTH') 
    When (T.co in ('rg', 'qi')) then ('EX2') 
    When (T.co in ('LT', 'SL', 'ST')) then ('EX3') 
    End) as Company_Group , 

在這裏我要where子句公司集團直接.IF我使用任何與條款或把這個子查詢這完全是執行上面的查詢和執行中使用where子句。所以它採取大量的時間所以我的要求,我可以直接通過我的where條件查詢中的別名列。

+0

交叉應用案例陳述後,我得到不正確的語法附近案件我得到@Serg – bvpk1234

+0

嗨Serg是這個交叉應用程序將在創建過程中,因爲它不是爲我工作時,嘗試使用此創建過程。但實際SQL它正確地工作,並給出準確的結果。謝謝你的幫助.. :) – bvpk1234

相關問題