Intereting Posts
Добавить новую строку в gridview ms-access: механизм БД не может найти входную таблицу или запрос Условные JOIN разные таблицы Entity Framework Code Первый класс с родителями и дочерними лицами того же типа, что и собственный класс Строки из разных таблиц в одной строке sql Слишком мало параметров ошибки MS Access SQL SQL объединяет две таблицы без ключей / отношений Как использовать динамический SQL для объявления имени столбца, полученного из имени таблицы? как отображать числовое значение в словах Какие улучшения SQL вы ожидаете? Найти значения, которые не существуют в таблице Запрос UNION ALL: «Слишком много полей» T-SQL: использование CASE в инструкции UPDATE для обновления определенных столбцов в зависимости от условия Невозможно запустить динамический запрос в хранимой процедуре при выборе количества записей Есть ли запрос Oracle SQL, который объединяет несколько строк в одну строку?

Сложная группировка в SQL-запросе

У меня довольно сложный SQL-запрос, который мне нужно собрать. Прости меня, я не волшебный волшебник с SQL.

Вот мои две таблицы (значительно упрощенные):

TABLEA

id request_id page_views step ----------------------------------- 1 1 0 0 2 1 0 1 3 1 0 2 4 1 0 3 5 2 0 0 6 2 0 1 7 2 1 2 8 3 0 0 9 3 0 1 10 4 0 0 11 4 0 1 12 4 0 2 

TableB

 id name phone ------------------------------ 1 John Deere 111-222-3333 2 Sally Sue 333-222-1111 3 Jacob Clark 434-343-4343 4 Alex Smith 222-112-2112 

Во-первых, должно быть соединение в таблицах, где tableA.request_id = tableB.id к:

 id request_id page_views step name phone ---------------------------------------------------------------- 1 1 0 0 John Deere 111-222-3333 2 1 0 1 John Deere 111-222-3333 3 1 0 2 John Deere 111-222-3333 4 1 0 3 John Deere 111-222-3333 5 2 0 0 Sally Sue 333-222-1111 6 2 0 1 Sally Sue 333-222-1111 7 2 1 2 Sally Sue 333-222-1111 8 3 0 0 Jacob Clark 434-343-4343 9 3 0 1 Jacob Clark 434-343-4343 10 4 0 0 Alex Smith 222-112-2112 11 4 0 1 Alex Smith 222-112-2112 12 4 0 2 Alex Smith 222-112-2112 

Из этой таблицы я хочу, чтобы группы возвращались, если они соответствуют условиям ниже. По группе я имею в виду группы строк, которые имеют один и тот же request_id . Вот условия:

  1. Из строк в группе ни у кого нет page_views больше 0.
  2. Из строк в группе ни один не имеет step больше 2.

Если одно из двух вышеуказанных условий не выполняется, вся группа не будет возвращена. Итак, вот что нужно вернуть:

 id request_id page_views step name phone ---------------------------------------------------------------- 8 3 0 0 Jacob Clark 434-343-434 9 3 0 1 Jacob Clark 434-343-434 10 4 0 0 Alex Smith 222-112-2112 11 4 0 1 Alex Smith 222-112-2112 12 4 0 2 Alex Smith 222-112-2112 

Группа «3» (или Джейкоб Кларк) не имела никаких строк, где page_views больше 0, и ни одна из строк не имеет step больше 2. То же самое с группой «4» (или с Алексом Смитом).

Вот в чем проблема. Мне нужен один SQL-запрос, который будет обрабатывать все это. Первое соединение может быть подзапросом, без проблем:

 SELECT sub.* FROM ( SELECT tableA.*, tableB.name, tableB.phone FROM `tableA`, `tableB` WHERE tableA.`request_id` = tableB.id ) sub 

После этого я не уверен.

Любая помощь будет оценена по достоинству.

Вам нужно рассчитать максимальные представления и шаги (по запросу_id) отдельно в подзапросе, а затем использовать request_id с достаточно малыми значениями:

 SELECT a.*, b.name, b.phone FROM ( SELECT request_id FROM tableA GROUP BY request_id HAVING MAX(page_views) <= 0 AND MAX(step) <= 2 ) AS sumQ INNER JOIN tableA AS a ON sumQ.request_id = a.request_id INNER JOIN tableB AS b ON a.request_id = b.id ; 

или, альтернативно:

 SELECT a.*, b.name, b.phone FROM tableA AS a INNER JOIN tableB AS b ON a.request_id = b.id WHERE a.request_id IN ( SELECT request_id FROM tableA GROUP BY request_id HAVING MAX(page_views) <= 0 AND MAX(step) <= 2 ) ; 

По моему опыту, первая версия, как правило, быстрее.

Вы можете сделать это с WHERE NOT EXISTS :

 Select A.id, A.request_id, A.page_views, A.step, B.name, B.phone From TableA A Join TableB B On A.request_id = B.Id Where Not Exists ( Select * From TableA A2 Where A2.request_Id = A.request_id And (A2.page_views > 0 Or A2.step > 2) )