Предложить оптимизированный запрос, используя 4 таблицы (RIGHT JOIN v / s INNER JOIN & HAVING) - PullRequest
0 голосов
/ 30 июля 2010

У меня следующая структура таблицы

  • table_country ==> country_id (PK) | страна | статус
  • table_department ==> отдел_идентификатора (PK) | отдел | country_id (FK)
  • table_province ==> Province_id (PK) | провинция | Идентификатор отдела (ФК)
  • table_district ==> district_id (PK) | район | провинция_ид (фк)

ПРИМЕЧАНИЕ: все таблицы движка innoDB

В одной стране может быть несколько департаментов, в одном департаменте может быть несколько провинций, а в одной провинции - несколько округов. Теперь мне нужно искать только те страны, в которых есть хотя бы один район

Я написал 2 SQL-запроса ниже, в моем случае оба запроса возвращают одинаковые результаты .... опишите разницу между этими запросами

Использование RIGHT JOIN:

SELECT c.country_id as id, c.country as name 
FROM table_country c 
RIGHT JOIN table_department d ON d.country_id=c.country_id 
RIGHT JOIN  table_province p ON p.department_id=d.department_id 
RIGHT JOIN table_district ds ON ds.province_id=p.province_id 
WHERE c.status='Active' GROUP BY (c.country_id)

Использование предложений INNER JOIN и HAVING:

SELECT COUNT(ds.district), c.country_id as id, c.country as name 
FROM table_country c 
INNER JOIN table_department d ON d.country_id = c.country_id 
INNER JOIN table_province p ON p.department_id = d.department_id 
INNER JOIN table_district ds ON ds.province_id = p.province_id 
WHERE c.status='Active' 
GROUP BY (c.country_id)  
HAVING  COUNT(ds.district)>0

Скажите, пожалуйста, где оба эти запроса влияют на результаты, и какой мне нужно использовать, или мне нужно использовать другой запрос?

Заранее спасибо

1 Ответ

0 голосов
/ 13 февраля 2016

Я бы предложил использовать второй из двух ваших запросов (с внутренними объединениями), но без предложения HAVING, поскольку он не требуется, поскольку для внутренних объединений требуется, чтобы любая строка в конечном результате ДОЛЖНА иметь строку в таблице районов.

Первый из ваших запросов, использующий более экзотическую серию ПРАВ ВНЕШНЕГО СОЕДИНЕНИЯ, в конечном итоге дает тот же результат - но поскольку они являются внешними соединениями, он потенциально менее эффективен.Другим способом представления вашего первого запроса было бы обратить последовательность таблиц следующим образом:

SELECT
      c.country_id AS id
    , c.country AS name
    , COUNT(ds.district)
FROM table_district ds
      INNER JOIN table_province p ON ds.province_id = p.province_id
      INNER JOIN table_department d ON p.department_id = d.department_id
      INNER JOIN table_country c ON d.country_id = c.country_id
WHERE c.status='Active'
GROUP BY
      c.country_id
    , c.country

, и, надеюсь, при инвертировании таким образом ясно, что строка результатов не может существовать, если в таблице районов нет строки..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...