Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247

Вывести названия спонсоров, которые не делали пожертвования указанным отделениям

12.07.2022, 20:11. Показов 964. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте! Наверняка однотипные темы про запросы в базу данных "Hospital" тут встречаются очень часто, но ответа на этот вопрос я так и не нашел. Просьба помочь.

Необходимо написать запрос, в котором выводится список спонсоров, которые не делали пожертвования отделениям “Травмотология” и “Хирургическое”.

Схема БД следующая (необходимую связку выделил красным):


Отделения у нас следующие:

Травматология и Хирургическое с id-шниками 2 и 3.

Спонсоры:
Название: Screenshot_3.png
Просмотров: 64

Размер: 2.3 Кб
Обращаю внимание на спонсора Umbrella Corporation с id-шником 1.

Таблица пожертвований:

Как видно по таблице, Umbrella Corporation (Sponsorid 1) сделала пожертвования сразу отделению "Приёмный покой" (DepartmentId 1), а затем, через время, отделениям “Травматология” и “Хирургическое”.

Написал следующий запрос:
T-SQL
1
2
3
4
5
6
7
--8. Вывести названия спонсоров, которые не делали пожертвования отделениям “Травматология” и “Хирургическое”.
SELECT Sponsors.Name AS Спонсор
FROM Sponsors, Donations
WHERE Donations.SponsorId = Sponsors.Id AND Donations.DepartmentId != ALL (SELECT Departments.Id
                                                            FROM Departments
                                                            WHERE Departments.Name = 'Травматология' OR 
                                                            Departments.Name = 'Хирургическое')
По логике запроса он должен выводить названия спонсоров, ГДЕ Donations.SponsorId равен Id спонсора и Donations.DepartmentId не равен ни Donations.DepartmentId строки 'Травматология', ни строки 'Хирургическое'. И запрос сию логику выполняет, но кроме одного - сразу он выбирает Umbrella Corporation, потому что она донатит отделению с id 1, а то что потом она же донатит отделениям 2 и 3, то запрос её не выбирает, но в списке спонсоров она уже есть:


Подскажите пожалуйста, как можно решить эту задачу?

Не по теме:


P.S. В процессе написания поста заметил ошибки в словах 'Травматология' и 'Хирургическое'. Все исправлено, проблема не в этом.

0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.07.2022, 20:11
Ответы с готовыми решениями:

Вывести все пожертвования за последний месяц в виде: отделение, спонсор, сумма пожертвования, дата пожертвования
SELECT Departmenid, Sponsorid, Amount, FROM Donation WHERE ( ??????????????????????????????? ) Как выставить проверку...

Найти докторов, которые делали назначения пациентам из тех палат, которые они не посещали
Доброго времени суток. Необходима помощь в выполнении задания( По разработанной ЕР-модели была составлена БД. Необходимо составить 3...

Вывести слова последовательности, которые удовлетворяют указанным условиям
Дана последовательность, содержащая до 5 слов, в каждом из которых до 5 строчных латинских букв; между соседними словами — не менее одного...

5
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
12.07.2022, 21:17
WHERE NOT EXISTS
0
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
12.07.2022, 21:48  [ТС]
Цитата Сообщение от iap Посмотреть сообщение
WHERE NOT EXISTS
Правильно ли я вас понял? Написал вот так:
T-SQL
1
2
3
4
5
6
SELECT Sponsors.Name AS Спонсор
FROM Sponsors, Donations
WHERE Donations.SponsorId = Sponsors.Id AND NOT EXISTS (SELECT Departments.Id
                                            FROM Departments
                                            WHERE Departments.Name = 'Травматология' OR 
                                            Departments.Name = 'Хирургическое')
Убрал в таблице пожертвований у Umbrella Corporation пожертвования в 'Травматология' и 'Хирургическое', но при выполнении этого запроса она так же не отображается, будто бы пожертвования есть. То есть, не работает.
0
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
13.07.2022, 10:26
таки департменты связаны с донатами. а тс выбирает всех без разбору в exists
0
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
13.07.2022, 17:30  [ТС]
Цитата Сообщение от pincet Посмотреть сообщение
таки департменты связаны с донатами. а тс выбирает всех без разбору в exists
Связаны, очень даже связаны. Знать бы что с этим делать)

Пришла идея написать подзапрос в подзапросе, что бы определить, не равен ли id департамента в донатах id департаментов указанных отделений, но воспроизвёл свою же первоначальную логику.)
T-SQL
1
2
3
4
5
6
7
8
SELECT Sponsors.Name AS Спонсор
FROM Sponsors, Donations
WHERE Donations.SponsorId = Sponsors.Id AND Donations.DepartmentId = ALL
    (SELECT Donations.DepartmentId FROM Donations WHERE Donations.DepartmentId != ALL
    (SELECT Departments.Id
    FROM Departments
    WHERE Departments.Name = 'Травматология' OR 
    Departments.Name = 'Хирургическое'))
0
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
14.07.2022, 09:45  [ТС]
Решил задачу следующим образом: проверяем имя спонсора на совпадение имени спонсора, который пожертвовал в указанные отделения.
T-SQL
1
2
3
4
5
6
7
8
SELECT Sponsors.Name
FROM Sponsors
WHERE Sponsors.Name != ALL
    (SELECT Sponsors.Name
    FROM Donations
    JOIN Departments ON Donations.DepartmentId = Departments.Id
    JOIN Sponsors ON Donations.SponsorId = Sponsors.Id
    WHERE Departments.Name = 'Травматология' OR Departments.Name = 'Хирургическое')
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.07.2022, 09:45
Помогаю со студенческими работами здесь

Вывести на консоль те слова заданной последовательности, которые удовлетворяют указанным условиям
Дана последовательность, содержащая до 5 слов, в каждом из которых до 5 строчных латинских букв; между соседними словами — не менее одного...

Вывести названия которые не использовались
Как вывести названия отелей, которые не использовались при заказе?

Вывести названия игрушек, которые подходят детям от 1 до 3 лет
1)Создать файл содержащий сведения об ассортименте игрушек в магазине. Структура записи: название игрушки, цена, кол-во, возрастные...

Вывести названия игрушек, которые подходят детям N лет
Вот задача: Создать файл Ф с информацией про игрушки: название, стоимость, возрастные рамки детей, для которых предназначена игрушка....

Вывести названия палат, которые находятся в отделении “Intensive Treatment”
SELECT FROM Wards WHERE ( = 'Intensive Treatment' ) Не совсем понимаю правильно ли составил запрос. Нужно еще...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru