Условные соединения | SQL | Оптимизация производительности и сокращение нет. из ПРИСОЕДИНЕНИЙ

#sql #join #impala

Вопрос:

У меня есть следующие таблицы:

t1:

 create table t1 (auth_date string,
                 auth_nbr int,
                 debit_date string,
                 debit_nbr int,
                 txn_dttm string,
                 iss_id string,
                 audit_num int);

insert into t1 values 
('01-05-2021',12,null,null,'01-05-2021','b',124),
(null,null,'02-05-2021',13,'02-05-2021','c',125),
('02-05-2021',14,'02-05-2021',14,'02-05-2021','d',126);
 

t2:

 create table t2 (txn_amt int,txn_dttm string,iss_id string,audit_num int);

insert into t2 values 
(2000,'01-05-2021','b',124),
(2500,'02-05-2021','c',125),
(1000,'02-05-2021','d',126);
 

Как я хочу получить свой результат:

 dw_date|dw_nbr|amt
01-05-2021|12|2000
02-05-2021|13|2500
02-05-2021|14|1000
 

У меня есть следующий запрос. Но так как присоединение-это тяжелая операция, и я хочу сузить ее только до 1 присоединения. Но мое присоединение в обоих случаях-это разные условия, т. е. в первом условии соединение выполняется на 3 кольцах, а в другом-на 2 кольцах. Я хотел найти способ, как я могу достичь желаемого результата. Условные Соединения. Или что-нибудь еще.
Из таблицы t2 мне просто нужен соответствующий txn_amt.

 select dw_date,dw_nbr,amt 
from (select t1.auth_date,t1.auth_nbr,t2.amt from t1 join t2 on t1.txn_dttm=t2.txn_dttm and t1.iss_id=t2.iss_id and t1.audit_num=t2.audit_num 
where auth_date is not null and auth_nbr is not null and debit_date is null and debit_nbr is null)a 
union all 
select dw_date,dw_nbr,amt 
from (select t1.debit_date,t1.debit_nbr,t2.amt from t1 join t2 on t1.txn_dttm=t2.txn_dttm and t1.audit_num=t2.audit_num 
where debit_date is not null and debit_nbr is not null)a;
 

Ответ №1:

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

 -- MySQL(v5.8)
WITH a_cte AS (
    SELECT t1.auth_date, t1.auth_nbr, t2.txn_amt
         , t1.debit_date, t1.debit_nbr
         , CASE WHEN t1.iss_id = t2.iss_id
                   THEN 1
                ELSE 0
           END iss_id
    FROM t1
    INNER JOIN t2
            ON t1.txn_dttm = t2.txn_dttm 
           AND t1.audit_num = t2.audit_num 
), b_cte AS (
    SELECT auth_date AS dw_date
         , auth_nbr AS dw_nbr
         , txn_amt AS amt
    FROM a_cte
    WHERE iss_id = 1
        AND auth_date is not null 
        AND auth_nbr is not null 
        AND debit_date is null 
        AND debit_nbr is null
    
    UNION ALL
    
    SELECT debit_date AS dw_date
         , debit_nbr AS dw_nbr
         , txn_amt AS amt
    FROM a_cte
    WHERE debit_date is not null 
        AND debit_nbr is not null 
)
SELECT *
FROM b_cte;
 

Пожалуйста, проверьте по URL https://dbfiddle.uk/?rdbms=mysql_8.0amp;fiddle=1a482589e2cdc1f6b288c93f88150fa5

Комментарии:

1. Привет @AnukritiSingh, пожалуйста, проверьте это. Надеюсь, вы получите желаемый результат, а также улучшите производительность. Пожалуйста, дайте мне знать, если возникнут какие-либо вопросы по этому поводу.

2. Вопрос помечен для impala, а не для mysql. Вы уверены, что это правильный ответ?

3. @RahulBiswas. Спасибо за ответ. Я проверю и дам вам знать.

4. @AnukritiSingh помог ли вам мой ответ?

5. @RahulBiswas, да, это помогло мне. Огромное спасибо.