SQL或首次检查后停止

ste*_*ris 6 sql t-sql sql-server select where

一旦条件满足,是否可以让SQL停止检查WHERE子句?例如,如果我有如下声明:

SELECT * FROM Table1 
WHERE Table1.SubID = (SELECT TOP 1 SubID FROM Table2 ORDER BY Date DESC) 
OR Table1.OrderID = (SELECT TOP 1 OrderID FROM Table2 ORDER BY Date DESC)
Run Code Online (Sandbox Code Playgroud)

第一次检查后是否可以停止执行?实质上,只应使用where子句中的两个检查中的一个,优先于第一个.以下示例案例.

示例案例:

情况1

Table1 SubID=600 OrderID=5

Table2 TOP 1 SubID=NULL

Table2 TOP 1 OrderID=5

Matches the OrderID to 5
Run Code Online (Sandbox Code Playgroud)

案例2

Table1 SubId=600 OrderId=5

Table2 Top 1 SubID=600

Table2 Top 1 OrderID=3

Matches to SubID=600, not OrderID=3
Run Code Online (Sandbox Code Playgroud)

鉴于建议的答案,with似乎是解决SQL本身无法做到的最佳解决方案.对于我的具体情况,问题出在试图将其放入时outer apply,如下所示.

SELECT * FROM tbl_MainFields
OUTER APPLY
(
    WITH conditional AS
    (
        SELECT 1 AS 'choice', PlanCode, Carrier
        FROM tbl_payers
        WHERE tbl_payers.PlanCode = 
            (
                SELECT TOP 1 PlanCode 
                FROM tbl_payerDenials 
                WHERE tbl_payerDenials.AccountNumber = tbl_mainFields.AccountNumber
                ORDER BY InsertDate DESC
            )
        UNION ALL
        SELECT 2 AS 'choice', PlanCode, Carrier
        FROM tbl_payers
        WHERE tbl_payers.OrderNum = 
            (
                SELECT TOP 1 DenialLevel
                FROM tbl_payerDenials
                WHERE tbl_payerDenials.AccountNumber = tbl_mainFields.AccountNumber
                ORDER BY InsertDate DESC
            )
)
SELECT
    PlanCode AS DenialPC,
    Carrier AS DenialCAR
FROM conditional
WHERE choice = (SELECT MIN(choice) FROM conditional)    

) denialData
Run Code Online (Sandbox Code Playgroud)

ste*_*ris -1

感谢@RaduGheorghiu 的灵感。此功能类似于建议的WITHMIN组合,但允许在OUTER APPLY

SELECT * FROM tbl_MainFields
OUTER APPLY
(
    SELECT TOP 1
        PlanCode AS DenialPC,
        Carrier AS DenialCAR,
        Precedence
    FROM
    (
        SELECT 
            1 AS 'Precedence', 
            PlanCode, 
            Carrier
        FROM tbl_payers
        WHERE tbl_payers.PlanCode = 
            (
                SELECT TOP 1 PlanCode 
                FROM tbl_payerDenials 
                WHERE tbl_payerDenials.AccountNumber = tbl_mainFields.AccountNumber
                ORDER BY InsertDate DESC
            )
        UNION ALL
        SELECT 
            2 AS 'Precedence', 
            PlanCode, 
            Carrier
        FROM tbl_payers
        WHERE tbl_payers.OrderNum = 
            (
                SELECT TOP 1 DenialLevel
                FROM tbl_payerDenials
                WHERE tbl_payerDenials.AccountNumber = tbl_mainFields.AccountNumber
                ORDER BY InsertDate DESC
            )
    ) AS denialPrecedence
    ORDER BY Precedence
) denialData
Run Code Online (Sandbox Code Playgroud)