【问题标题】:TSQL Query data from inner select or joinTSQL 从内部选择或连接查询数据
【发布时间】:2015-01-09 18:47:30
【问题描述】:

我有一个非常基本格式的 TSQL 查询:

我这个查询的目标是找到L.localeID = x 所在的所有数据。正如您在查询的第二个内部选择语句中看到的那样。

我在内部选择中有它,因为该表中有多个结果链接到父表。

如何才能以正确的格式获取此查询?我需要以特定方式加入表格还是子查询可以工作?

     SELECT A.[trainingEventID],
        A.[teTitle],
        A.[teDesc],
        A.[teSource],
        A.[teType],
        A.[teMedium],
        A.[teFlag],
        A.[teCreator],
        A.[teCreated],
        seg.[segmentDate],
        convert(decimal(10, 2), seg.[nonProdHrs]) as nonProdHrs,
        (
             SELECT emp.[FirstName] as trainerFirst,
                    emp.[LastName] as trainerLast
            FROM BS_Training_Trainers as trn
            LEFT OUTER JOIN employeeTable as emp
            ON trn.trainerEmpID = emp.EmpID
            WHERE trn.segmentID = seg.teSegmentID
            FOR    XML PATH ('trainer'), TYPE, ELEMENTS, ROOT ('trainers')
        ),
        (
         SELECT L.[recordID],
                L.[segmentID],
                L.[localeID],
                L.[teammateCount],
                L.[leaderCount]
            FROM dbo.BS_TrainingEvent_SegmentDetails AS L
            WHERE seg.teSegmentID = L.segmentID
            FOR    XML PATH ('detail'), TYPE, ELEMENTS, ROOT ('details')
        )
        FROM   [red].[dbo].[BS_TrainingEvents] AS A
        INNER JOIN dbo.BS_TrainingEvent_Segments AS seg
        ON A.[trainingEventID] = seg.[trainingEventID]

更新

这是一个 SQL Fiddle:http://sqlfiddle.com/#!6/fe3cf/11

【问题讨论】:

  • 那么上面的行不通?由于拉回 L.[LocaleID] 的子查询已经包含并加入到 A. 你可以只做 where Seg.LocaleID = X?
  • 我没有查询seg table;我正在查看内部选择 L.
  • 很抱歉。我看错了。我将从 Select 中获取子查询并将其作为连接放置,然后在其中的选择位置 L.* 中选择 L 中的所有值,然后您可以对其应用条件。或者,您可以将所有内容包装到子查询 SELECT * FROM ([WHOLEQUERY]) a Where a.record_ID = x
  • 我认为我在加入时会遇到的问题是无法使用FOR XML。我需要显示事件的能力,然后显示它的所有片段,这就是为什么我将它作为内部选择只是不确定如何通过该内部数据进行查询。

标签: sql sql-server tsql stored-procedures


【解决方案1】:

您可以使用 XQuery 检查从 dbo.BS_TrainingEvent_SegmentDetails 生成的 XML 是否包含 <localeID>200</localeID>。为此,您需要以可以在 WHERE 中引用它的方式定义 XML 列。一种方法是使用 CROSS APPLY:

CROSS APPLY
    (
     SELECT L.[recordID],
            L.[segmentID],
            L.[localeID],
            L.[teammateCount],
            L.[leaderCount]
        FROM dbo.BS_TrainingEvent_SegmentDetails AS L
        WHERE seg.teSegmentID = L.segmentID
        FOR    XML PATH ('detail'), TYPE, ELEMENTS, ROOT ('details')
    ) AS x (SegmentDetailsXML)

然后您可以将主选择中的值引用为x.SegmentDetailsXML,并且还可以在WHERE 子句like this 中使用它:

WHERE
    x.SegmentDetailsXML.exist('/details/detail/localeID[text() = "200"]') = 1

或者,如果200 应该通过变量名传递,like this

WHERE
    x.SegmentDetailsXML.exist('/details/detail/localeID[text() = sql:variable("@localeID")]') = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多