【问题标题】:subquery - how to refer to outer query value子查询 - 如何引用外部查询值
【发布时间】:2013-06-17 04:15:46
【问题描述】:

下面的查询工作正常:

SELECT 
   tblCase.ID AS CaseID, tblCase.UserID AS MyCasesFilter, 
   tblGroupMembership.UserID AS GroupShareFilter, 
   tblDirectCaseSharing.ReceiverUserID AS DirectShareFilter, tblCase.EntryDate, 
   tblUser.LastName AS CaseAuthor, tblCase.Name AS CaseName, 
   COUNT(DISTINCT tblCaseImage.ID) AS TotalImages, 
   tblCaseType.Name AS CaseType, tblCase.SiteName, tblCase.Category, 
   tblCase.FollowUpDateTime, tblCase.Notes
FROM     
   tblDirectCaseSharing 
RIGHT OUTER JOIN
   tblCase 
INNER JOIN tblUser ON tblCase.UserID = tblUser.ID ON tblDirectCaseSharing.CaseID = tblCase.ID 
LEFT OUTER JOIN
   tblGroupMembership 
INNER JOIN
   tblGroupCase ON tblGroupMembership.GroupID = tblGroupCase.GroupID ON tblCase.ID = tblGroupCase.CaseID 
LEFT OUTER JOIN
   tblCaseType ON tblCase.CaseTypeID = tblCaseType.ID 
LEFT OUTER JOIN
   tblCaseImage ON tblCase.ID = tblCaseImage.CaseID
GROUP BY 
   tblCase.ID, tblCaseType.Name, tblCase.SiteName, tblCase.EntryDate, 
   tblCase.Category, tblCase.FollowUpDateTime, tblCase.Notes, tblCase.UserID, 
   tblGroupMembership.UserID, tblDirectCaseSharing.ReceiverUserID, 
   tblUser.LastName, tblCase.Name
HAVING 
   (tblCase.UserID = 1) 
   AND (tblGroupMembership.UserID = 2) 
   AND (tblDirectCaseSharing.ReceiverUserID = 3)
ORDER BY 
   tblCase.EntryDate DESC

我想使用选择子查询向上述结果添加一个额外的选择列:

STUFF((
SELECT ', ' +tblGroup.Name  as [text()] 
FROM     tblCase INNER JOIN
                  tblGroupCase ON tblCase.ID = tblGroupCase.CaseID INNER JOIN
                  tblGroup ON tblGroupCase.GroupID = tblGroup.ID
WHERE tblCase.ID = ***
FOR XML PATH('')
),1,2,'')
AS ConcatGroupShares

select 子查询有一个 where 子句,我需要获取 tblcase.id,它是结果集的第一列。如何在子查询中引用该值。

【问题讨论】:

    标签: sql sql-server subquery


    【解决方案1】:

    在主查询中放一个别名

    SELECT 
       tcase.ID AS CaseID, tblCase.UserID AS MyCasesFilter, 
       tblGroupMembership.UserID AS GroupShareFilter, 
       tblDirectCaseSharing.ReceiverUserID AS DirectShareFilter, tblCase.EntryDate, 
       tblUser.LastName AS CaseAuthor, tblCase.Name AS CaseName, 
       COUNT(DISTINCT tblCaseImage.ID) AS TotalImages, 
       tblCaseType.Name AS CaseType, tblCase.SiteName, tblCase.Category, 
       tblCase.FollowUpDateTime, tblCase.Notes
     FROM     
       tblDirectCaseSharing 
     RIGHT OUTER JOIN
       tblCase As tcase                       <=====
    

    并在子查询中使用这个别名:

     STUFF((
    SELECT ', ' +tblGroup.Name  as [text()] 
    FROM     tblCase INNER JOIN
                      tblGroupCase ON tblCase.ID = tblGroupCase.CaseID INNER JOIN
                      tblGroup ON tblGroupCase.GroupID = tblGroup.ID
     WHERE tblCase.ID = tcase.id
     FOR XML PATH('')
     ),1,2,'')
     AS ConcatGroupShares
    

    有关共同相关子查询的更多信息:

    http://en.wikipedia.org/wiki/Correlated_subquery

    【讨论】:

    • '在主查询中放一个别名'——我会用 ' 来扩展它……并养成使用短的习惯(但可能有意义)一般的表别名'。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    相关资源
    最近更新 更多