簡體   English   中英

嘗試在連接中使用 Case Expression 的結果。需要改進查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM