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

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

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

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


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

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

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