【问题标题】:TSQL Query Inner Selects from Outer Where ClauseTSQL 从外部 Where 子句查询内部选择
【发布时间】:2014-11-25 01:06:52
【问题描述】:

我正在处理一个动态查询,但我有点不确定如何完成这项任务。这似乎很常见,所以我会将其用作学习经验。

我的结构有几张桌子。我在这个示例中包含了其中的一些,因为一旦我可以获取基本查询,我就可以添加它。

在我的最终查询中,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');

【问题讨论】:

    标签: sql-server tsql stored-procedures sql-server-2012


    【解决方案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');
    

    【讨论】:

    • 这看起来很有希望。可悲的是,我从未想过在加入相同数据的同时进行内部选择,但这被证明是一个很好的用例。它适用于我的小提琴,所以它是一个可以接受的答案:) 我会尝试将它纳入我的生产过程并让你知道(它的价值)。您在第二个内部连接中有一个错字,应该是 tesd. 而不是 tesd=
    • 谢谢,我已经解决了。
    • 这就是我遇到的问题。这也发生在我自己的方法上,所以我可能一直都在正确的轨道上,但现在回到这个..sqlfiddle.com/#!6/661f8/1。一个 trainingEvent 可以包含多个段,每个段可以包含多个段详细信息。该数据需要按段分组,因为现在,它为每个段复制每个事件。它需要是 Training Event -> Segments (grouped) -> Segment details。这有意义吗?如果您查看小提琴,您会注意到重复的数据,并希望我正在尝试做的事情
    • 如果您添加一个子选择需要等于 JOINed Segment 表的条件呢?我已经在上面添加了。
    • 我很欣赏这个答案,但它仍然对我不起作用。这是我永远无法超越的部分:)。我会继续搞砸的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2016-10-01
    • 2019-08-18
    相关资源
    最近更新 更多