2013-05-29 2 views
0

Ceci est mon requête SQL:en utilisant une partie SELECT OUTER JOIN

SELECT 
    b.MaakArtikel, 
    b.Bewerking, 
    [pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000',0-b.Startdag_backwards) AS Startdatum, 
    i.Class_06 AS Afdeling, 
    b.Minuten*10+ISNULL(br.Tijd,0) AS Minuten, 
    1+ISNULL(br.Orders,0) AS Aantal 
FROM [pp].dbo.VW_BEWERKINGSTRUCTUUR b 
    LEFT OUTER JOIN [211].dbo.Items i 
     ON b.MaakArtikel = i.ItemCode 
    LEFT OUTER JOIN [pp].dbo.VW_BEZETTING_RAW br 
     ON [pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000',0-b.Startdag_backwards) = br.Start 
     AND i.Class_06 = br.Afdeling 
WHERE MaakArtikel = 'HT 10.038' 

La requête fonctionne correctement, mais il est un peu lent. C'est à cause de ma deuxième OUTER JOIN. Je dois rejoindre la vue par Startdatum (c'est sélectionné à la ligne 4). Comme ce n'est pas un vrai nom de colonne, je ne peux pas l'utiliser directement dans mon OUTER JOIN. Cela signifie que la fonction [pp].dbo.WORKINGDAYADD() doit être déclenchée deux fois (une fois dans ma sélection ce qui n'est pas un problème, et une fois dans mon OUTER JOIN qui est un double travail).

Je pourrais écrire une procédure stockée et utiliser le résultat de la fonction [pp].dbo.WORKINGDAYADD() dans une variable, mais ce n'est pas disjocable. Est-il possible d'utiliser Startdatum dans mon expression OUTER JOIN? Ou dois-je vraiment utiliser une procédure stockée pour cela?

+0

D'où vient la table 'Startdag_backwards'? – GarethD

+0

@yvytty Vous voulez le rejoindre avec une vraie colonne? C'est parce qu'il n'y a pas de vraie colonne avec cette valeur, je dois calculer la bonne date puis la rejoindre – Jovano

+0

@GarethD 'Startdag_backwards' vient de' [pp] .dbo.VW_BEWERKINGSTRUCTUUR', je vais éditer mon post et ajouter quelques aliasses pour le rendre clair – Jovano

Répondre

1

Vous pouvez simplement déplacer la fonction à une sous-requête, comme ci-dessous:

SELECT MaakArtikel, 
     Bewerking, 
     b.Startdatum, 
     i.Class_06 AS Afdeling, 
     Minuten * 10 + ISNULL(br.Tijd,0) AS Minuten, 
     1 + ISNULL(br.Orders, 0) AS Aantal 
FROM ( SELECT *, 
        StartDatum = [pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000', 0 - Startdag_backwards) 
      FROM [pp].dbo.VW_BEWERKINGSTRUCTUUR b 
     ) b 
     LEFT OUTER JOIN [211].dbo.Items i 
      ON b.MaakArtikel = i.ItemCode 
     LEFT OUTER JOIN [pp].dbo.VW_BEZETTING_RAW br 
      ON b.Startdatum = br.Start 
      AND i.Class_06 = br.Afdeling 
WHERE MaakArtikel = 'HT 10.038'; 

NOTE

Je ne tolère pas d'utiliser SELECT *, et dans votre requête de travail, vous devez remplacer cela avec seulement les colonnes dont vous avez besoin de [pp].dbo.VW_BEWERKINGSTRUCTUUR.

0

Que diriez-vous de stocker vos résultats

[pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000',0-Startdag_backwards) AS Startdatum 

Dans un SQL variable

DECLARE @myVariable DATETIME 
SET @myVariable = [pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000',0-Startdag_backwards) 

ensuite sur votre jointure externe faire ce

ON @myVariable = br.Start 

Ou quelque chose à cet effet. Bobby

0

Vous pouvez stocker la sortie de [pp].dbo.WORKINGDAYADD() dans une variable, puis utiliser la variable dans le code. (je suppose que le type de la fonction de données de résultat est datetime ..)

DECLARE @StartDatum datetime 
SET @StartDatum = ([pp].dbo.WORKINGDAYADD('2013-06-27 00:00:00.000',0-Startdag_backwards)) 

SELECT 
    MaakArtikel, 
    Bewerking, 
    @StartDatum, 
    i.Class_06 AS Afdeling, 
    Minuten*10+ISNULL(br.Tijd,0) AS Minuten, 
    1+ISNULL(br.Orders,0) AS Aantal 
FROM [pp].dbo.VW_BEWERKINGSTRUCTUUR b 
    LEFT OUTER JOIN [211].dbo.Items i 
     ON b.MaakArtikel = i.ItemCode 
    LEFT OUTER JOIN [pp].dbo.VW_BEZETTING_RAW br 
     ON br.Start = @StartDatum 
     AND i.Class_06 = br.Afdeling 
WHERE MaakArtikel = 'HT 10.038'