Как я могу переписать запрос с объединениями, чтобы показать критерии, которые не были включены в мой поиск? - PullRequest
0 голосов
/ 12 октября 2011

Здесь меня беспокоит еще один запрос.

Select S.ID,S.Name,S.Surname,B.Title,SB.DateAndTimeIssued FROM Students S
INNER JOIN StudentBooks SB ON
S.ID = SB.StudentID
INNER JOIN Books B
ON B.ID = SB.BookID
WHERE B.ID = @BookID

Результаты:

1 | asd   | asd   | Book      | 2011-10-12 18:31:40.557
1 | asd   | asd   | Gray Book | 2011-10-12 18:36:26.950
1 | asd   | asd   | Gray Book | 2011-10-12 18:36:34.137

Объяснение: Этот запрос возвращает мне имена и фамилии всех студентов, которым была выдана книга с определенным идентификатором. Дата и книга, выданная им, также отображаются.

Проблема в том, что эти книги в таблице выше были назначены только одному студенту. Как мне переписать этот запрос, чтобы показать, какие ученики не получили определенную книгу с идентификатором @BookID? Когда я использую WHERE NOT B.ID = @BookID, он только посылает мне имена студентов, которые не получили книгу, но получили книгу в прошлом.

Моя попытка:

SELECT S.Name,S.Surname FROM Students S
INNER JOIN StudentBooks SB
ON SB.StudentID = S.ID
INNER JOIN Books B
ON B.ID = SB.BookID
WHERE NOT SB.BookID = @BookID

Мне нужны имена студентов, которые вообще не получили книгу. «Студенты», «Книги учеников» и «Книги» - это отдельные таблицы, «Студенты» и «Книги учеников» оказываются в отношениях «многие ко многим», поскольку книга может быть переиздана им позднее, или копия книги может быть переиздана. выдается им, если они потеряли свои

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Полагаю, вы можете объединить таблицу книг и книг учеников и получить все идентификаторы студентов, которые взяли книгу, а затем найти любой идентификатор в таблице учеников, который отсутствует в комбинации идентификаторов, которые вы получаете из первой таблицы ( книги и учебники для студентов)

SELECT S.ID,S.Name,S.Surname,B.Title,SB.DateAndTimeIssued 
FROM Students S 
WHERE s.id NOT IN (SELECT id 
                   FROM Books b 
                   JOIN StudentBooks sb 
                   ON b.ID = sb.BookID
                   WHERE b.ID = @BookID)
0 голосов
/ 12 октября 2011

Внешнее объединение для получения всех студентов, может быть что-то вроде:

Select S.ID,S.Name,S.Surname,B.Title,SB.DateAndTimeIssued
FROM Students S
LEFT OUTER JOIN StudentBooks SB 
    ON S.ID = SB.StudentID
    AND SB.BookId = @BookId
LEFT OUTER JOIN Books B
    ON B.ID = SB.BookID

, которое не будет включать название для тех студентов, которые не имеют записи в Книге учеников, если вы хотите название для каждой записи:

Select S.ID,S.Name,S.Surname,B.Title,SB.DateAndTimeIssued
FROM Students S
CROSS JOIN (select title from Books where Id = @BookId) B
LEFT OUTER JOIN StudentBooks SB
    on SB.StudentId = S.ID
    and SB.BookId = @BookId

Но я не понимаю результатов, которые вы показываете:

1 | asd   | asd   | Book      | 2011-10-12 18:31:40.557
1 | asd   | asd   | Gray Book | 2011-10-12 18:36:26.950
1 | asd   | asd   | Gray Book | 2011-10-12 18:36:34.137

Как я понимаю ваш запрос, результат должен быть для одной конкретной книги на основе Book.Id = @BookID, но вы показываетедва разных названия книг, "Книга" и "Серая книга".

Как написано, ни один из этих запросов не обобщает получение записей для более чем одного book.id одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...