有两个不同键的条件JOIN

时间:2018-10-02 16:35:03

标签: postgresql amazon-redshift

我有一个查询,该查询产生两个单独的ID:

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

但是问题是,我显然希望将其加入两个适当的ID中,以便最终输出看起来像这样:

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 :(得分:1)

使用SQLfiddle,因为其中一个参数可能为null:

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)

请注意,出于性能原因,您应该加入已经聚合的表(因此,我已将原始查询放置在派生表中)。

答案 1 :(得分:0)

尝试一下:

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

答案 2 :(得分:0)

我认为足够的联接就是这样:

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

因为据我了解,如果有用户ID,则需要按用户ID加入;如果有供应商ID,则应按供应商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

但是与以前的选项相比,这太冗长了,我认为应该产生相同的结果