Данные левого соединения SQL становятся меньше

 

      Некоторое время назад одноклассник столкнулся с проблемой при написании SQL: два SQL-соединения казались одинаковыми, но их количество было разным. Причина в том, что условие where после левого соединения фильтрует данные, делая их меньше. Две части sql следующие:

select count(1)
  from (select *
          from KXAPP.I_CASH_LOAN_WHITELIST_C2_V_NEW b
         where b.BG_DT < '20180820'
           and b.EN_DT >= '20180904') gh
  left join (select *
               from KXAPP.I_CASH_LOAN_WISH_SCORE
              where busi_dt = '20180820') hg
    on gh.loan_no = hg.loan_no
select count(1)
  from KXAPP.I_CASH_LOAN_WHITELIST_C2_V_NEW b
  left join KXAPP.I_CASH_LOAN_WISH_SCORE c
    on b.loan_no = c.loan_no
 where b.BG_DT < '20180820'
   and b.EN_DT >= '20180904'
   and busi_dt = '20180820') hg

     На первый взгляд кажется, что между двумя разделами sql нет никакой разницы. Первый - сначала получить подтаблицу через условие, а затем связать; второй - сначала связать, а затем отфильтровать после прохождения условия. После статистики выясняется, что количество данных вверху больше, чем внизу.

    На самом деле эти две ссылки разные. В первом режиме связи основная таблица - это gh; во втором режиме связи основная таблица - это b. Причина, по которой объем данных во втором методе ссылки меньше, чем в первом методе ссылки, заключается в том, что где добавляется после ссылки для фильтрации результатов ссылки.

    Вот пример для иллюстрации:

Структура таблицы A выглядит следующим образом:

 

Структура таблицы B выглядит следующим образом: 

select *
  from (select 1 as a, 2 as b
          from dual
        union all
        select 2 as a, 2 as b from dual) a
  left join (select 3 as a, 2 as b
               from dual
             union all
             select 2 as a, 2 as b from dual) b
    on a.a = b.a
   and b.a = 1;

select *
  from (select 1 as a, 2 as b
          from dual
        union all
        select 2 as a, 2 as b from dual) a
  left join (select 3 as a, 2 as b
               from dual
             union all
             select 2 as a, 2 as b from dual) b
    on a.a = b.a
 where b.a = 1;

 

рекомендация

отblog.csdn.net/lz_peter/article/details/83185909
рекомендация