2013-06-17 4 views
8

Poniższa kwerenda działa poprawnie:Podzapytanie - jak odnieść się do zewnętrznej wartości zapytań

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 

Chcę dodać dodatkowy wybierz kolumnę do powyższego wyniku używając select podzapytanie, które jest:

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 

Wybierz podkwerendę ma klauzulę where i potrzebuję uzyskać tblcase.id, która jest pierwszą kolumną zestawu wyników. jak mogę odwołać się do tej wartości w podzapytanie.

Odpowiedz

5

Umieść alias w głównym zapytaniu

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

i używać tej nazwy aliasu w podzapytaniu:

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 

więcej o współzależnych sub-zapytania:

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

+2

* 'Wstaw alias do głównej kwerendy' * - rozwinąłbym to za pomocą * '... i dostanie się do t nawyk używania krótkich (ale prawdopodobnie znaczących) aliasów w ogóle "*. :) –