2013-06-17 3 views
8

La requête ci-dessous fonctionne très bien:sous_requête - comment se référer à la valeur de requête externe

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 

Je veux ajouter une colonne de sélection supplémentaire au résultat ci-dessus à l'aide d'un sous-requête de sélection qui est:

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 

La sous-requête select a une clause where et j'ai besoin d'obtenir le tblcase.id qui est la première colonne du jeu de résultats. comment faire référence à cette valeur dans la sous-requête.

Répondre

5

Mettre un nom d'alias dans la requête principale

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      <===== 

et utiliser ce nom d'alias dans la sous-requête:

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 

Plus sur les sous-requêtes liées à la co-:

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

+2

* 'Mettez un nom d'alias dans la requête principale' * - Je développerais cela avec * '... et entrerai Il a l'habitude d'utiliser des alias de table courts (mais probablement significatifs) en général '*. :) –

Questions connexes