2013-06-17 7 views
8

Die Abfrage unten funktioniert gut:Unterabfrage - wie man äußere Abfragewert verweisen

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 

ich eine zusätzliche Auswahl Spalte zu dem obigen Ergebnis mit einer ausgewählten Unterabfrage hinzufügen möchten, das ist:

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 

Die Select-Unterabfrage hat eine Where-Klausel und ich muss die Tblcase.id abrufen, die die erste Spalte der Ergebnismenge ist. Wie kann ich diesen Wert in der Unterabfrage referenzieren?

Antwort

5

einen Alias-Namen in der Hauptabfrage Put

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

Und diesen Alias-Namen in der Unterabfrage verwenden:

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 

Mehr über co-bezogene Unterabfragen:

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

+2

* 'Geben Sie einen Aliasnamen in die Hauptabfrage ein' * - Ich würde das mit * erweitern ... und in t einsteigen Die Angewohnheit, kurze (aber möglicherweise aussagekräftige) Tabellenaliasnamen im Allgemeinen zu verwenden *. :) –

Verwandte Themen