[英]Attempting to use result of Case Expression in a join .. need to improve query
我有以下查詢,它允許我根據以下條件從主表(事務)或 TransactionRules 加入基於 TransactionClassID 的 TransactionClass 表:
SELECT
Description,
TC.Name,
(CASE
WHEN (TR.TransactionRuleId > 0)
THEN TR.TransactionRuleId
ELSE T.TransactionClassId
END) As ClassId
FROM Transactions AS T
LEFT JOIN TransactionRules TR ON T.Description LIKE TR.Pattern
LEFT JOIN TransactionClasses TC ON TC.TransactionClassId =
(CASE
WHEN (TR.TransactionRuleId > 0)
THEN TR.TransactionClassId
ELSE T.TransactionClassId
END)
查詢在 SQL Server 上運行,實際上,它根據 TransactionRules 上的連接是否成功檢索正確的 TransactionClass 條目。 上面的查詢有效,但我試圖簡化查詢,這樣我就不必在兩個地方重復 CASE 表達式。
我試圖在變量中捕獲 case 表達式的結果並按如下方式使用它:
SELECT
Description,
x
FROM Transactions AS T
LEFT JOIN TransactionRules TR
ON T.Description LIKE TR.Pattern
LEFT JOIN TransactionClasses TC
ON TC.TransactionClassId = x
WHERE x = (CASE
WHEN (TR.TransactionRuleId > 0)
THEN TR.TransactionRuleId
ELSE T.TransactionClassId
END)
但我得到錯誤:
[S0001][207] 第 8 行:列名稱“x”無效。
我試圖只有一個 CASE 表達式哪里出錯了?
CROSS APPLY
是一種重用計算值的簡潔方法,例如
SELECT
[Description]
, TC.[Name]
, Class.Id
FROM Transactions AS T
LEFT JOIN TransactionRules TR ON T.[Description] LIKE TR.Pattern
CROSS APPLY (
VALUES (
CASE
WHEN TR.TransactionRuleId > 0
THEN TR.TransactionRuleId
ELSE T.TransactionClassId
END
)
) AS Class (Id)
LEFT JOIN TransactionClasses TC ON TC.TransactionClassId = Class.Id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.