oracle12 c, sql, разница между count (*) и sum () - PullRequest
0 голосов
/ 09 июля 2020

Скажите мне разницу между sql1 и sql2:

sql1:

select count(1)
from table_1 a
inner join table_2 b on a.key = b.key where a.id in (
  select id from table_1 group by id having count(1) > 1
) 

sql2:

select sum(a) from (
  select count(1) as a
  from table_1 a
  inner join table_2 b on a.key = b.key group by a.id having count(1) > 1
)

Почему результат не тот?

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Запросы даже не похожи. Они очень разные. Давайте проверим первый:

select count(1)
from table_1 a
inner join table_2 b
on a.key = b.key 
where a.id in (
  select id from table_1 group by id having count(1) > 1
) ;

Сначала вы выполняете внутреннее соединение:

select count(1) 
from table_1 a 
inner join table_2 b 
on a.key = b.key

В этом случае вы можете использовать count (1), count (id), count (*), эквивалентно. Вы подсчитываете общие элементы в обеих таблицах: те, которые имеют общее ключевое поле.

После этого вы выполняете это:

where a.id in (
      select id from table_1 group by id having count(1) > 1
    ) 

В другими словами, каждый "id" таблицы_1 должен как минимум два раза встречаться в таблице table_1.

И, наконец, вы делаете это:

select count(1)

Другими словами, подсчет эти элементы. Итак, переведя на английский sh, вы сделали это:

  1. получите каждую запись table_1 и соедините с записями table_2 для идентификатора и получите только те, которые соответствуют
  2. для приведенный выше результат, отфильтруйте только элементы, идентификатор которых в таблице_1 встречается более одного раза
  3. подсчитайте этот результат

Давайте посмотрим, что произойдет со вторым запросом:

select sum(a) from (
  select count(1) as a
  from table_1 a
  inner join table_2 b 
  on a.key = b.key 
  group by a.id 
  having count(1) > 1
);

Вы делаете такое же внутреннее соединение:

  select count(1) as a
  from table_1 a
  inner join table_2 b 
  on a.key = b.key 

, но группируете его по идентификатору таблицы:

  group by a.id 

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

  having count(1) > 1

Результатом является набор записей, которые имеют общее ключевое поле в обеих таблицах, но сгруппированы по идентификатору: это означает, что только те поля, которые есть как минимум два раза в table_b, выводятся из этого соединения . После этого вы группируете по идентификатору, свертывая эти результаты в поле table_1.id и подсчитывая результат. Я предполагаю, что очень немногие записи будут соответствовать этим строгим критериям.

И, наконец, вы суммируете все те, которые установлены.

0 голосов
/ 09 июля 2020

Когда вы используете count (*), вы подсчитываете ВСЕ строки. Функция SUM () - это агрегатная функция, которая возвращает сумму всех или отдельных значений в наборе значений.

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