2013-02-04 4 views
4

Existe-t-il un moyen dans SQL Server 2008 de faire quelque chose comme ci-dessous?SQL Server - Conditionnel APPLICATION EXTERNE

La table extérieure (jointe) peut-elle être spécifiée en fonction d'une condition?

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 
+0

Merci Gordon et JW pour votre réponse. Je veux accepter les deux comme des réponses car cela m'a vraiment aidé à apprendre une bonne technique. Cependant, je me rends compte que je n'ai pas fourni assez d'informations sur ce que j'essayais de faire. S'il vous plaît voir ma question éditée. – mmmmmm

Répondre

4

Vous pouvez facilement le faire avec juste une jointure:

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 

Faire la top avant la union all devrait également aider l'optimiseur produire un meilleur plan de requête, dans le cas où les tables sont des jointures vraiment complexes.

En outre, faire top sans order by est généralement mal vu. Il peut renvoyer des lignes différentes avec des invocations différentes, mais les lignes ne sont pas forcément aléatoires.

+0

Voulez-vous dire top _without_ une commande par plutôt qu'avec? – Bridge

+0

@Bridge. . . Merci d'avoir lu ce que je veux dire au lieu de ce que j'écris. –

4

pour cette solution,

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 
+0

Merci JW. Très belle approche. J'ai réalisé que je n'étais pas très clair sur ce que j'essayais de faire. J'essayais d'éviter qu'une requête coûteuse ne soit exécutée alors que je n'avais pas besoin de récupérer les champs de la grande table. S'il vous plaît voir ma question éditée. – mmmmmm