Условное СОЕДИНЕНИЕ с двумя разными ключами - PullRequest
0 голосов
/ 02 октября 2018

У меня есть запрос, который выдает два отдельных идентификатора:

SELECT
date, 
user_id,
vendor_id,
SUM(purchase) user_purchase
SUM(spend) vendor_spend
GROUP BY 1,2,3
FROM tabla.abc

Это приводит к следующим результатам:

date   user_id   vendor_id   user_purchase   vendor_spend
1/1/18   123      NULL         5.00             0.00   
1/1/18   NULL     456          0.00             10.00  

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

client_id   user_id   vendor_id
456789      123       NULL
101112      NULL      456

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

date    client_id  user_id   vendor_id   user_purchase   vendor_spend
1/1/18   456790     123      NULL         5.00             0.00   
1/1/18   101112     NULL     456          0.00             10.00

Так есть ли способ, которым я могунравится условное соединение?Что-то вроде WHERE user_id IS NULL THEN... и т.д ...

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

Попробуйте это:

SELECT
date, 
COALESCE(lu.client_id, lv.client_id) AS client_id,
user_id,
vendor_id,
SUM(purchase) user_purchase
SUM(spend) vendor_spend
FROM tabla.abc
LEFT JOIN tabla.link AS lu USING (user_id)
LEFT JOIN tabla.link AS lv USING (vendor_id)
GROUP BY 1,2,3,4
0 голосов
/ 03 октября 2018

Я думаю, что достаточное соединение - это просто:

FROM aggregated_table t1
LEFT JOIN client_id_table t2
ON t1.user_id=t2.user_id
OR t1.vendor_id=t2.vendor_id

, потому что, как я понимаю, вам нужно присоединиться по идентификатору пользователя, если есть идентификатор пользователя, и по идентификатору поставщика, если есть идентификатор поставщика.Использование левого соединения с OR делает именно это.

Также возможно и условное соединение.Если вы знакомы с оператором CASE, он отлично работает в условиях соединения.Подобная вещь может быть выражена как:

FROM aggregated_table t1
LEFT JOIN client_id_table t2
ON CASE 
    WHEN t1.user_id is not null THEN t1.user_id=t2.user_id
    WHEN t1.vendor_id is not null THEN t1.vendor_id=t2.vendor_id
END

, но это слишком многословно по сравнению с предыдущим вариантом, который, я думаю, должен дать тот же результат

0 голосов
/ 02 октября 2018

Используйте not distinct from, поскольку один из аргументов может быть нулевым:

select *
from (
    select
        date, 
        user_id,
        vendor_id,
        sum(purchase) user_purchase,
        sum(spend) vendor_spend
    from table1
    group by 1,2,3
    ) t1
join table2 t2 
    on (t1.user_id, t1.vendor_id) 
    is not distinct from (t2.user_id, t2.vendor_id)

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

...