2014-11-24 72 views
0

我正在進行動態查詢,我有點不確定如何完成此任務。這似乎是一些常見的東西,所以我會將其用作學習體驗。TSQL查詢內部從外部選擇條款

我的結構有幾個表。我在這個例子中包含了其中的一些,因爲一旦我可以獲得基本查詢,我可以添加到它。

在我最後的查詢中,WHERE子句將會動態生成。

這裏是我的結構的小提琴:http://sqlfiddle.com/#!6/2b104

在內部選擇c.你會發現我有一個名爲localeID列。我需要能夠在我的外部WHERE子句中查詢。

例如,該localeID將鏈接到localeCodes表,並從那裏,我有另一個表locations。最終結果將是「向我展示我在北美的一切」。那麼,我們知道localeID 8 =猶他州和猶他州在北美(當加入地點表)。

下面是該查詢與OP保持:

SELECT a.[trainingEventID], 
    a.[teTitle], 
    a.[teSource], 
    a.[teType], 
    a.[teMedium], 
    a.[teFlag], 
    a.[teCreator], 
    a.[teCreated], 
    a.[tePOC], 
    a.[teDirector], 
    a.[teTeammateImpact], 
    a.[teCustomerImpact], 
    a.[teComplexity], 
    a.[intID], 
    a.[teNeededBy], 
    a.[approver], 
    a.[approvalDate], 
    (SELECT b.[trainingEventID], 
      b.[segmentDate], 
      b.[nonProdHrs], 
      (SELECT c.[segmentID], 
        c.[localeID], 
        c.[teammateCount], 
        c.[leaderCount] 
      FROM BS_TrainingEvent_SegmentDetails AS c 
      WHERE c.[segmentID] = b.teSegmentID 
      FOR XML PATH ('detail'), TYPE, ELEMENTS, ROOT ('details')) 
    FROM BS_TrainingEvent_Segments AS b 
    WHERE b.trainingEventID = a.[trainingEventID] 
    FOR XML PATH ('segment'), TYPE, ELEMENTS, ROOT ('segments')) 
FROM BS_TrainingEvents AS a 
--WHERE c.[localeID] = '8' 
FOR XML PATH ('event'), TYPE, ELEMENTS, ROOT ('events'); 

回答

1

怎麼樣,我們也加入到這兩個下級表,所以我們可以縮小結果集根據您的c.localeID

SELECT a.[trainingEventID], 
     a.[teTitle] , 
     a.[teSource] , 
     a.[teType] , 
     a.[teMedium] , 
     a.[teFlag] , 
     a.[teCreator] , 
     a.[teCreated] , 
     a.[tePOC] , 
     a.[teDirector] , 
     a.[teTeammateImpact] , 
     a.[teCustomerImpact] , 
     a.[teComplexity] , 
     a.[intID] , 
     a.[teNeededBy] , 
     a.[approver] , 
     a.[approvalDate] , 
     (SELECT b.[teSegmentID], 
        b.[trainingEventID] , 
        b.[segmentDate] , 
        b.[nonProdHrs] , 
        (SELECT c.[segmentID] , 
           c.[localeID] , 
           c.[teammateCount] , 
           c.[leaderCount] 
         FROM  BS_TrainingEvent_SegmentDetails AS c 
         WHERE  c.[segmentID] = b.teSegmentID 
         AND  c.segmentID = tesd.SegmentID 
        FOR 
         XML PATH('detail') , 
          TYPE , 
          ELEMENTS , 
          ROOT('details') 
        ) 
      FROM  BS_TrainingEvent_Segments AS b 
      WHERE  b.trainingEventID = a.[trainingEventID] 
      AND  b.trainingEventID = tes.trainingEventID 
     FOR 
      XML PATH('segment') , 
       TYPE , 
       ELEMENTS , 
       ROOT('segments') 
     ) 
FROM BS_TrainingEvents a 
INNER JOIN BS_TrainingEvent_Segments tes ON a.trainingEventID = tes.trainingeventID 
INNER JOIN BS_TrainingEvent_SegmentDetails tesd ON tes.teSegmentID = tesd.SegmentID 
INNER JOIN BS_LocaleCodes as locale ON tesd.localeID = locale.localeID 
INNER JOIN BS_Locations as loc ON loc.location = locale.location 
WHERE loc.[location] = 'Arizona' 
FOR  XML PATH('event') , 
      TYPE , 
      ELEMENTS , 
      ROOT('events'); 
+0

這看起來很有希望。可悲的是,我從來沒有想過做內部選擇,同時也加入了相同的數據,但這證明是一個很好的用例。它與我的小提琴一起工作,所以它是一個可以接受的答案:)我試着把它放到我的製作過程中,讓你知道它的價值。你在第二個內部連接上有一個錯字,應該是'tesd.'而不是'tesd =' – SBB 2014-11-24 15:54:03

+0

謝謝,我修復了這個問題。 – 2014-11-24 16:05:17

+0

所以這裏是我遇到的問題。這發生在我自己的方法上,所以我可能一直在正確的軌道上,但現在回到這.. http://sqlfiddle.com/#!6/661f8/1。 trainingEvent可以包含多個段,每個段可以包含多個segmentDetails。此數據需要按分段分組,因爲此時它將每個分段的每個事件複製一次。它需要是培訓活動 - >細分(分組) - >細分細節。這有意義嗎?如果你看小提琴,你會注意到重複的數據,並希望我想要做什麼 – SBB 2014-11-24 16:52:31