Выполнится ли запрос по задаче на SQL - MySQL
Формулировка задачи:
Здравствуйте.
Есть три таблицы:
1. Система
ID_системы Имя_системы
1 Имя_1
2 Имя_2
2. Сообщения
ID_сообщения ID_системы Сообщение
2 1 Сообщение1фыва
4 1 Сообщение2фыва
6 2 Сообщение10фыва
8 3 Сообщение12фыва
3. Справочник
ID_справочника ID_системы Код_системы
2 1 Код_системы_1
3 2 Код_системы_2
4 3 Код_системы_3
Зная 2 кода систем - Код_системы_1 и Код_системы_2 – необходимо написать SQL запрос, который выведет имена указанных систем и количество сообщений, переданных каждой системой. Написать запросы на синтаксисе Transact-SQL, Oracle.
Я не очень владею SQL поэтому прошу вашей помощи по валидации следующего запроса:
Не судите строго за такой нубский запрос, умом понимаю, что надо создавать временную таблицу, в неё записывать имя системы и рассчитанное количество сообщений для каждой из систем, но как это сделать правильно не знаю. Пока получилось то, что получилось выше, но врядли это валидный запрос (
SELECT Имя_системы; Количество сообщений AS c1 FROM Система WHERE c1 = (SELECT COUNT (ID_системы) FROM Система GROUP BY ID_системы HAVING COUNT (ID_системы= 1) AND SELECT * FROM Система INNER JOIN Сообщения ON Система.ID_системы = Сообщения.ID_системы AND SELECT ID_системы FROM Справочник WHERE Code IN ('Код_системы_1','Код_системы_2') );
Решение задачи: «Выполнится ли запрос по задаче на SQL»
textual
Листинг программы
WITH systems(id, name) AS ( SELECT 1, 'Имя_1' FROM dual UNION ALL SELECT 2, 'Имя_2' FROM dual ), messages (id, system_id, message_name) AS ( SELECT 2, 1, ' Сообщение1фыва' FROM dual UNION ALL SELECT 4, 1, ' Сообщение2фыва' FROM dual UNION ALL SELECT 6, 2, ' Сообщение10фыва' FROM dual UNION ALL SELECT 8, 3, ' Сообщение12фыва' FROM dual ), lookup (id, system_id, system_code) AS ( SELECT 2, 1, 'Код_системы_1' FROM dual UNION ALL SELECT 3, 2, 'Код_системы_2' FROM dual UNION ALL SELECT 4, 3, 'Код_системы_3' FROM dual ) SELECT systems.name, (SELECT COUNT(*) FROM messages WHERE messages.system_id = systems.id) AS messages_qty FROM lookup JOIN systems ON systems.id = lookup.system_id WHERE system_code IN ('Код_системы_1', 'Код_системы_2')
Объяснение кода листинга программы
- В этом коде используется оператор
WITH
, который позволяет выполнить несколько запросов с одним и тем же набором данных, не запрашивая его каждый раз заново. - Сначала создается представление
systems
, которое содержит список систем с их идентификаторами и именами. - Затем создается представление
messages
, которое содержит список сообщений с их идентификаторами, идентификаторами систем и именами сообщений. - Далее создается представление
lookup
, которое содержит список систем с их идентификаторами и кодами. - Затем происходит основной запрос, в котором происходит соединение таблиц
lookup
иsystems
по идентификаторам систем и выборка систем, для которых в таблицеlookup
есть записи. - В запросе также используется подзапрос, который считает количество сообщений для каждой системы.
- В результате выборки выводятся имена систем и количество сообщений для каждой системы.
- В конце кода применяется условие, которое фильтрует только те системы, для которых в таблице
lookup
есть записи с кодами 'Код_системы_1' и 'Код_системы_2'.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д