将一个表中的两个不同列连接到另一个表中的同一列?

时间:2021-03-29 00:19:31

标签: sql

我正在处理具有名为 ios_app_idandroid_app_idapp_id 的字段的查询。 downloads 表中的 app_id 可以是 products 表中的 ios_app_idandroid_app_id

因此,我不能在 p.ios_app_id = d.app_id 上运行 downloadsproducts 表的简单联接,然后在 p.android_app_id = d.app_id 上再次联接,是否正确? {1}}?这会导致记录数不正确吗?

select p.product_id, d.date, d.downloads,
from products p 
inner join download d
on p.ios_app_id = d.app_id

UNION 

select p.product_id, d.date, d.downloads
from products p
inner join download d
on p.android_app_id = d.app_id

我会尝试:

 select p.product_id, d.date, d.downloads,
    from products p 
    inner join downloads d
    on p.ios_app_id = d.app_id
    inner join downloads d
    on p.android_app_id = d.app_id

基本上我想理解为什么这里需要联合而不是仅仅两次加入这两个领域?谢谢

3 个答案:

答案 0 :(得分:1)

只需join两次:

select p.product_id,
       coalesce(di.date, da.date),
       coalesce(di.downloads, da.downloads)
from products p left join
     downloads di
     on p.ios_app_id = di.app_id left join
     downloads da
     on p.android_app_id = da.app_id;

这应该比使用 union 的方法更有效。基本上,它尝试使用两个 id 加入。 coalesce() 将结果合并为一列。

答案 1 :(得分:1)

请记住,INNER JOIN 的目的是获取存在于两组数据(我们称为表 A 和表 B)上的值,并使用特定列将它们连接起来。在您的示例中,如果您尝试执行 INNER JOIN 两次,会发生的情况是第一次执行 INNER JOIN 时,完整的 PRODUCTS 表是您的表 A,并且您获得所有产品已下载 ios_app,但现在(这是关键部分)此结果成为您的新数据集,因此它成为下一个 inner join 的新表 A。这就是问题所在,因为您想要的是再次加入整个表,而不仅仅是第一次加入的结果,但这不是它的工作原理。这就是您需要使用 UNION 的原因,因为您需要独立获取结果然后添加它们。

另一种方法是使用 LEFT JOIN,但您可能会得到空值和重复项 - 而且它不太“干净”-。因此,对于您的特定情况,我认为使用 UNION 更清晰、更容易理解。

答案 2 :(得分:0)

如果您在第一个查询中使用 left join,它将起作用。

create table all_products as (select p.product_id, d.date, d.downloads,
from products p 
left join downloads d
on p.ios_app_id = d.app_id)
select a.product_id, d.date, d.downloads from all_products a left join downloads d 
on a.android_app_id = d.app_id inner join