2013-06-17 13 views
8

La domanda sotto sta lavorando bene:subquery - come fare riferimento al valore di query esterna

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 

Voglio aggiungere una colonna di selezione aggiuntiva al risultato sopra utilizzando una subquery di selezione che è:

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 sottoquery select ha una clausola where e ho bisogno di ottenere il tblcase.id che è la prima colonna del set di risultati. come riferimento a quel valore nella sottoquery.

risposta

5

Mettere un nome alias nella query 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      <===== 

e utilizzare questo nome alias nel subquery:

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 

Ulteriori informazioni su sub-query co-related:

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

+2

* 'Metti un nome alias nella query principale' * - Io lo espanderei con * '... e arrivo in t ha l'abitudine di usare alias di tabella brevi (ma possibilmente significativi) in generale '*. :) –

Problemi correlati