2013-05-29 51 views
0

這是我的SQL查詢:使用外SELECT部分​​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' 

查詢正常工作,但它是一個有點慢。這是因爲我的第二個OUTER JOIN。我必須加入Startdatum(這是在第4行選擇)的觀點。由於它不是真實的專欄名稱,因此我無法直接在我的OUTER JOIN中使用它。這意味着功能[pp].dbo.WORKINGDAYADD()必須被觸發兩次(一次在我的選擇中,這不是問題,一次在我的OUTER JOIN這是雙重工作)。

我可以編寫一個存儲過程,並將函數[pp].dbo.WORKINGDAYADD()的結果用於變量,但這不是可悲的。有沒有在我的OUTER JOIN表達式中使用Startdatum的方法?或者我真的必須爲此使用存儲過程嗎?

+0

「Startdag_backwards」來自哪個表? – GarethD

+0

@yvytty你的意思是加入一個真正的專欄?這是因爲沒有真正的列值,我必須計算正確的日期然後加入它 – Jovano

+0

@GarethD'Startdag_backwards'來自'[pp] .dbo.VW_BEWERKINGSTRUCTUUR',我將編輯我的帖子並添加一些別名清楚地說明這一點 – Jovano

回答

1

你可以只移動功能的子查詢,如下:

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'; 

注意

我不會寬恕使用SELECT *,並且在您的工作查詢中,您應該將其替換爲[pp].dbo.VW_BEWERKINGSTRUCTUUR所需的列。

0

如何存儲

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

你的結果爲可變

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

一個SQL然後在你的外部聯接做到這一點

ON @myVariable = br.Start 

或者其他類似的效果。 Bobby

0

您可以將[pp].dbo.WORKINGDAYADD()的輸出存儲在變量中,然後在代碼中使用該變量。 (我假定該函數的結果數據類型爲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'