I have these 3 tables as below.
Table: Student ------------- | ID | Name| +-----+-----+ | S01 |Alex | | S02 |Sam | | S03 |May | ------------- Table: Book -------------- | ID | Name | +-----+------+ | B01 |BookA | | B02 |BookB | | B03 |BookC | -------------- Table:StudentBooks -------------- | SID| BID | +-----+------+ | S01 |B01 | | S02 |B02 | | S01 |B03 | | S02 |B03 | -------------- Here is the output I want to get.
----------------------- | Name | Book | +-------+-------------+ | Alex |BookA, Book C| | Sam |BookB, Book C| | May | | ----------------------- I tried with the following code, but it seems not able to get the correct book name based on the student name. My current output is that all the books are shown in every row, including student named 'May' which not allocated with any books.
SELECT s.Name AS Name, STUFF((SELECT ',' + b.Name FROM StudentBook sb JOIN Student s ON s.ID = sb.SID JOIN Book b ON b.ID = sb.BID WHERE s.Name = s.Name FOR XML PATH('')),1,1,'') AS Book FROM StudentBooks sb JOIN Book b ON b.ID = sb.BID JOIN Student s ON s.ID = sb.SID;
WHERE s.Name = s.Name? When is the value ofs.Namenot going to be the value ofs.Name(apart from when it'sNULL)?