Как правильно добавить включение в запрос sql с точки зрения соединения? - PullRequest
0 голосов
/ 07 августа 2020

Я работаю со следующим запросом TEST SQL, чтобы подсчитать количество клиентов на основе logi c +, которые получили конкретное c электронное письмо (убедитесь, что клиент существует в таблице отправленных писем)

select 
    count(distinct tab1.order_key) as VALUE
from 
    cust_order_type tab1   
inner join 
    cust_membership tab2 on tab1.transaction_id = tab2.transaction_id   
inner join 
    cust_transactions tab3 on tab1.transaction_id = tab3.transaction_id   
                           and tab3.coupon_id not in (123, 456) 
                           ---CHECK IF THEY RECEIVED THE EMAIL    
                           and tab3.customer_key IN (select customer_key from  cust_table tab4  
                                                      where tab4.email in (select email from Email_Sent_Date_List tab5 where tab5.EmailA_Date IS NOT NULL AND tab5.EmailA_Date >= '2020-07-06'))
inner join 
    cust_product_variation tab6 on tab3.product_variation_id = tab6.product_variation_id 
where 
    tab6.country in ('USA', 'CANADA')   
    and tab1.trans_date = '2020-07-06'

Этот запрос возвращает результат 600.

Вышеупомянутый запрос работал, но я заметил, что включенный запрос logi c проверяет, получил ли клиент электронное письмо или не существует во внутреннем соединении. Говоря об этом:

---CHECK IF THEY RECEIVED THE EMAIL
and tab3.customer_key IN (select customer_key from  cust_table tab4  where  tab4.email in (select email from Email_Sent_Date_List tab5 where tab5.EmailA_Date IS NOT NULL AND tab5.EmailA_Date >= '2020-07-06'))

Теперь я пытаюсь понять и задаться вопросом, является ли это правильным местом для этих критериев?

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

select count(distinct tab1.order_key) as VALUE
from cust_order_type tab1   
inner join cust_membership tab2
    on tab1.transaction_id = tab2.transaction_id   
   inner join cust_transactions tab3    
    on tab1.transaction_id = tab3.transaction_id   
    and tab3.coupon_id not in (123, 456) 
inner join cust_product_variation tab6 
    on tab3.product_variation_id = tab6.product_variation_id 
where tab6.country  IN ('USA','CANADA')   
    and tab1.trans_date  '2020-07-06'
    ---CHECK IF THEY RECEIVED THE EMAIL    
    and tab3.customer_key IN (select customer_key from  cust_table tab4  where  tab4.email in (select email from Email_Sent_Date_List tab5 where tab5.EmailA_Date IS NOT NULL AND tab5.EmailA_Date >= '2020-07-06'))

Теперь этот запрос возвращает результат 18000.

Число выходных данных другое, почему? Может ли кто-нибудь помочь мне понять это и предложить правильное расположение для этого критерия?

UPDATE : чтобы проверить, какие таблицы должны быть или не должны использоваться во внутреннем соединении. Я попытался выполнить тест.

Где я удалил критерии EMAIL SENT и выполнил следующий запрос:

select count(distinct tab1.order_key) as VALUE
from cust_order_type tab1   
inner join cust_membership tab2
    on tab1.transaction_id = tab2.transaction_id   
   inner join cust_transactions tab3    
    on tab1.transaction_id = tab3.transaction_id   
    and tab3.coupon_id not in (123, 456) 
inner join cust_product_variation tab6 
    on tab3.product_variation_id = tab6.product_variation_id 
where tab6.country  IN ('USA','CANADA')   
    and tab1.trans_date  '2020-07-06'

Вывод: 120000

Теперь добавлено внутреннее соединение с cust таблица (все еще без критериев EMAIL SENT)

select count(distinct tab1.order_key) as VALUE
from cust_order_type tab1   
inner join cust_membership tab2
    on tab1.transaction_id = tab2.transaction_id   
   inner join cust_transactions tab3    
    on tab1.transaction_id = tab3.transaction_id   
    and tab3.coupon_id not in (123, 456) 
inner join cust_product_variation tab6 
    on tab3.product_variation_id = tab6.product_variation_id

INNER JOIN cust_table tab4
ON tab3.customer_key = tab4.customer_key
 
where tab6.country  IN ('USA','CANADA')   
    and tab1.trans_date  '2020-07-06'

Тот же результат: 120000

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

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Рассмотрите возможность изменения спецификаций c JOIN на более компактный и понятный лог. c:

inner join Email_Sent_Date_List tab5
    on  tab4.email = tab5.email       
    and tab5.EmailA_Date IS NOT NULL      -- CHECK IF THEY RECEIVED THE EMAIL 
    and tab5.EmailA_Date >= '2020-07-06'  -- CHECK IF THEY RECEIVED THE EMAIL 

Фактически, вам может не понадобиться внешнее предложение WHERE, поскольку все соединения INNER JOIN и WHERE можно рассматривать как неявные JOIN. См. Более полную настройку с более полезными псевдонимами.

select count(distinct o.order_key) as [VALUE]
from cust_order_type o   
inner join cust_membership m
    on o.transaction_id = m.transaction_id   
    and o.trans_date = '2020-07-06'        -- MOVED FROM WHERE TO ON
inner join cust_transactions t    
    on o.transaction_id = t.transaction_id   
    and t.coupon_id not in (123, 456)
inner join cust_table c 
    on t.customer_key = c.customer_key
inner join Email_Sent_Date_List e
    on c.email = e.email       
    and e.EmailA_Date IS NOT NULL          -- CHECK IF THEY RECEIVED THE EMAIL 
    and e.EmailA_Date >= '2020-07-06'      -- CHECK IF THEY RECEIVED THE EMAIL 
inner join cust_product_variation p 
    on t.product_variation_id = p.product_variation_id 
    and p.country IN ('USA','CANADA')      -- MOVED FROM WHERE TO ON
    
0 голосов
/ 07 августа 2020

Ответ: Для тех, кто ищет аналогичный ответ или просто пытается понять лог c.

В моем случае query1 дает ожидаемый результат (по сравнению с результат запроса2, который дает больше подсчетов, чем количество контактов, фактически существующих в таблице EMAIL SENT).

Сохраняя logi c таким же, как в query1, я немного обновил его (что дает мне точную тот же результат, что и раньше)

Вот мой рабочий обновленный запрос1 (дающий тот же результат, что и раньше, который является ожидаемым результатом по сравнению с запросом2):

select count(distinct tab1.order_key) as VALUE
from cust_order_type tab1   
inner join cust_membership tab2
    on tab1.transaction_id = tab2.transaction_id   
   inner join cust_transactions tab3    
    on tab1.transaction_id = tab3.transaction_id   
    and tab3.coupon_id not in (123, 456)
inner join cust_table tab4 
on tab3.customer_key = tab4.customer_key
inner join Email_Sent_Date_List tab5
on tab4.email = tab5.email       
    and (select email from Email_Sent_Date_List tab5 where tab5.EmailA_Date IS NOT NULL AND tab5.EmailA_Date >= '2020-07-06')  ---CHECK IF THEY RECEIVED THE EMAIL 
inner join cust_product_variation tab6 
    on tab3.product_variation_id = tab6.product_variation_id 
where tab6.country  IN ('USA','CANADA')   
    and tab1.trans_date  '2020-07-06'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...