全外连接的替代方式

Posted

技术标签:

【中文标题】全外连接的替代方式【英文标题】:Alternative way of full outer join 【发布时间】:2021-03-19 11:10:30 【问题描述】:

我正在运行这个查询

select * from
(select name, count(distinct id) as ids, date 
from table1
group by name, date ) as tt
full outer join
(select st_name as name,count(distinct id) as ids, date 
from table2  
group by st_name, date) as ts
on tt.name= ts.name
and tt.ids = ts.ids

它运行成功,但我想问一下是否有其他更有效的方法来运行这个查询。

【问题讨论】:

查询试图做什么?该代码非常奇怪,因为它可能会从不同日期获取 id 的数量并将它们显示为相等 - 这似乎没有用。 我试图在这2个表匹配后找到table1或table2中不存在的行 @DrGenious 。 . .您可能希望在 on 子句中使用 date 【参考方案1】:

我假设您希望获得两个数字不相同的天数(这似乎是您希望从此类查询中获得的最合理的结果)。所以,这解决了这个问题。

FULL OUTER JOIN 应该没问题。但另一种方法是尝试UNION ALL 和聚合:

select name, sum(ids_1), sum(ids_2), date
from ((select name, count(distinct id) as ids_1, NULL as ids_2, date 
       from table1
       group by name, date
      ) 
      union all
      (select st_name as name, NULL, count(distinct id) as ids_2, date 
       from table2  
       group by st_name, date
      )
     ) 
group by name, date
having sum(ids_1) = sum(ids_2)

【讨论】:

以上是关于全外连接的替代方式的主要内容,如果未能解决你的问题,请参考以下文章

Oracle左连接右连接全外连接以及(+)号用法

Oracle左连接右连接全外连接以及(+)号用法

数据库的内连接外连接(左外连接右外连接全外连接)以及交叉连接(转)

Oracle 左连接右连接全外连接(+)号作用

左连接 ,右连接,内连接和全外连接的4者区别

MapReduce实现等值连接,左外连接,右外连接,全外连接