4

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
4

2 に答える 2

4

参加するだけで簡単にこれを行うことができます:

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

top前に行うことはunion all、テーブルが本当に複雑な結合である場合に、オプティマイザーがより良いクエリプランを作成するのにも役立ちます。

また、topなしで行うことorder byは一般的に眉をひそめます。呼び出しが異なるさまざまな行を返すことができますが、行がランダムであるとは限りません。

于 2013-02-04T14:17:56.907 に答える
4

これを試してみてください、

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
于 2013-02-04T13:34:23.477 に答える