Подзапросы против объединения нескольких таблиц - PullRequest
0 голосов
/ 06 января 2020

У меня 3 таблицы A, B, C. Я хочу перечислить количество пересечений.

Путь 1: -

select count(id) from A a join B b on a.id = b.id join C c on  B.id = C.id;

Результат Результат - X

Путь 2: -

SELECT count(id) FROM A WHERE id IN (SELECT id FROM B WHERE id IN (SELECT id FROM C));

Количество результатов - Y

Число результатов в каждом запросе различно. Что именно не так?

1 Ответ

2 голосов
/ 06 января 2020

A JOIN может умножить количество строк, а также отфильтровать строки.

В этом случае второй счет должен быть правильным, поскольку ничто не учитывается дважды - при условии, что id уникальный в a. Если нет, то ему нужно count(distinct a.id).

Для эквивалентного использования JOIN будет использоваться COUNT(DISTINCT):

select count(distinct a.id)
from A a join
     B b
     on a.id = b.id join
     C c
     on B.id = C.id;

Я упоминаю это для полноты , но не рекомендую этот подход . Умножение количества строк только для их удаления с использованием distinct неэффективно.

Во многих базах данных наиболее эффективным методом может быть:

select count(*)
from a
where exists (select 1 from b where b.id = a.id) and
      exists (select 1 from c where c.id = a.id);

Примечание. Предполагается, что индексы на столбцы id и id являются уникальными в a.

...