Выполнится ли запрос по задаче на 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 поэтому прошу вашей помощи по валидации следующего запроса:
Листинг программы
  1. SELECT
  2. Имя_системы;
  3. Количество сообщений AS c1
  4. FROM Система
  5. WHERE c1 =
  6. (SELECT COUNT (ID_системы) FROM Система
  7. GROUP BY ID_системы
  8. HAVING COUNT (ID_системы= 1)
  9. AND
  10. SELECT *
  11. FROM Система
  12. INNER JOIN Сообщения
  13. ON Система.ID_системы = Сообщения.ID_системы
  14. AND
  15. SELECT ID_системы
  16. FROM Справочник
  17. WHERE Code IN ('Код_системы_1','Код_системы_2')
  18. );
Не судите строго за такой нубский запрос, умом понимаю, что надо создавать временную таблицу, в неё записывать имя системы и рассчитанное количество сообщений для каждой из систем, но как это сделать правильно не знаю. Пока получилось то, что получилось выше, но врядли это валидный запрос (

Решение задачи: «Выполнится ли запрос по задаче на SQL»

textual
Листинг программы
  1. WITH systems(id, name) AS
  2. (
  3.   SELECT 1, 'Имя_1'
  4.   FROM dual
  5.   UNION ALL
  6.   SELECT 2, 'Имя_2'
  7.   FROM dual
  8. ),
  9. messages (id, system_id, message_name) AS
  10. (
  11.   SELECT 2, 1, ' Сообщение1фыва'
  12.   FROM dual
  13.   UNION ALL
  14.   SELECT 4, 1, ' Сообщение2фыва'
  15.   FROM dual
  16.   UNION ALL
  17.   SELECT 6, 2, ' Сообщение10фыва'
  18.   FROM dual
  19.   UNION ALL
  20.   SELECT 8, 3, ' Сообщение12фыва'
  21.   FROM dual  
  22. ),
  23. lookup (id, system_id, system_code) AS
  24. (
  25.   SELECT 2, 1, 'Код_системы_1'
  26.   FROM dual
  27.   UNION ALL
  28.   SELECT 3, 2, 'Код_системы_2'
  29.   FROM dual
  30.   UNION ALL
  31.   SELECT 4, 3, 'Код_системы_3'
  32.   FROM dual
  33. )
  34. SELECT systems.name,
  35.   (SELECT COUNT(*)
  36.    FROM messages
  37.    WHERE messages.system_id = systems.id) AS messages_qty
  38. FROM lookup
  39. JOIN systems
  40.   ON systems.id = lookup.system_id
  41. WHERE system_code IN ('Код_системы_1', 'Код_системы_2')

Объяснение кода листинга программы

  1. В этом коде используется оператор WITH, который позволяет выполнить несколько запросов с одним и тем же набором данных, не запрашивая его каждый раз заново.
  2. Сначала создается представление systems, которое содержит список систем с их идентификаторами и именами.
  3. Затем создается представление messages, которое содержит список сообщений с их идентификаторами, идентификаторами систем и именами сообщений.
  4. Далее создается представление lookup, которое содержит список систем с их идентификаторами и кодами.
  5. Затем происходит основной запрос, в котором происходит соединение таблиц lookup и systems по идентификаторам систем и выборка систем, для которых в таблице lookup есть записи.
  6. В запросе также используется подзапрос, который считает количество сообщений для каждой системы.
  7. В результате выборки выводятся имена систем и количество сообщений для каждой системы.
  8. В конце кода применяется условие, которое фильтрует только те системы, для которых в таблице lookup есть записи с кодами 'Код_системы_1' и 'Код_системы_2'.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут