我正在处理具有名为 ios_app_id
、android_app_id
和 app_id
的字段的查询。
downloads 表中的 app_id
可以是 products 表中的 ios_app_id
或 android_app_id
。
因此,我不能在 p.ios_app_id = d.app_id
上运行 downloads 和 products 表的简单联接,然后在 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
基本上我想理解为什么这里需要联合而不是仅仅两次加入这两个领域?谢谢
答案 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