Inner Join Производство декартовых произведений - PullRequest
0 голосов
/ 10 апреля 2020

Глядя на 2 запроса ниже, я предположил, что они вернут тот же набор результатов, но они далеко. Почему запрос 2 с внутренним объединением производит так много записей? Что я делаю неправильно? Я слишком долго смотрел на это, и мне нужна пара глаз sh, чтобы посмотреть на него.

SELECT COUNT(*)  
FROM ZCQ Z
WHERE Z.QUOTE_CUSTOMER_ID IN (SELECT CUSTOMER_ID FROM CUST_ORDER)
-- returned 6,646 RECS

SELECT COUNT(*) 
FROM ZCQ Z
INNER JOIN CUST_ORDER CO ON zquote_customer_id = co.customer_id
-- returned 4,232,473 RECS

Обратите внимание, что это Oracle 10g столы, но у них нет FK или PK настройка администратором базы данных.

1 Ответ

1 голос
/ 10 апреля 2020

Нет, они, как правило, не будут возвращать один и тот же результат.

  • Первая подсчитывает количество строк в ZCQ, которые соответствуют клиенту в CUST_ORDER.

  • Секунда подсчитывает общее количество совпадающих строк. Если в CUST_ORDER есть дубликаты клиентов, то будут учитываться все дубликаты.

Вы могли бы получить тот же результат, используя:

SELECT COUNT(DISTINCT z.zquote_customer_id) 
FROM ZCQ Z JOIN
     CUST_ORDER CO
     ON zquote_customer_id = co.customer_id;

Но IN или EXISTS, вероятно, более эффективны, чем удаление дубликатов после выполнения поиска.

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