2013-06-17 25 views
8

Các truy vấn dưới đây đang làm việc tốt:subquery - làm thế nào để tham khảo giá trị truy vấn bên ngoài

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 

Tôi muốn thêm một chọn cột bổ sung cho các kết quả trên sử dụng một subquery chọn đó là:

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 

Truy vấn con được chọn có mệnh đề where và tôi cần lấy tblcase.id, đây là cột đầu tiên của tập kết quả. làm thế nào để tôi tham khảo giá trị đó trong truy vấn phụ.

Trả lời

5

Đặt tên tắt trong truy vấn chính

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

Và sử dụng tên bí danh này trong 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 

Thông tin thêm về đồng liên quan đến phụ truy vấn:

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

+2

* 'Đặt tên bí danh trong truy vấn chính' * - Tôi sẽ mở rộng bằng * '... và tham gia vào t ông có thói quen sử dụng các bí danh bảng ngắn (nhưng có thể có ý nghĩa) nói chung '*. :) –

Các vấn đề liên quan