簡體   English   中英

SQL Server - 有條件的外部應用程序

[英]SQL Server - Conditional OUTER APPLY

SQL Server 2008中是否有一種方法可以執行下面的操作?

可以根據條件指定外部應用(連接)表嗎?

declare @bGetExtendedInfo bit
set @bGetExtendedInfo = 1

declare @param nvarchar(24)
set @param = 'CO-02-BBB'

select t1.*, t2.ID
from t1
outer apply (
              case when @bGetExtendedInfo= 0 
                  then (select 0) as ID  /* dummy value */
                  /*really expensive query trying to avoid when extended info is not needed*/
                  else (select top 1 ID from tbl1 where tbl1.code = @param)
              end
             ) t2

試一試,

DECLARE @bCond BIT
SET @bCond = 1

SELECT t1.*, t2.*
FROM   t1 OUTER APPLY
             (
                SELECT TOP 1 *
                FROM
                    (
                        SELECT *, 'a' src FROM tb10
                        UNION ALL
                        SELECT *, 'b' src FROM tb11
                    )s
                WHERE   src = CASE WHEN @bCond = 0 THEN 'a' ELSE 'b' END
             ) t2

您只需加入即可輕松完成此操作:

SELECT t1.*, t2.*
FROM   t1 cross join
       (SELECT *
        FROM (SELECT top 1 tb10.*, 0 as bCcond src FROM tb10 
              UNION ALL
              SELECT top 1 tb11.*, 1 as bCcond src FROM tb11
             ) t
        WHERE @bCond = bCcond
       ) t2

如果表是非常復雜的連接,那么在union all之前執行top也應該有助於優化器生成更好的查詢計划。

而且,在沒有order by情況下做top通常是不受歡迎的。 它可以返回具有不同調用的不同行,但不保證行是隨機的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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