Выполнится ли запрос по задаче на 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'.