Oracle 内连接和外连接有效组合

Posted

技术标签:

【中文标题】Oracle 内连接和外连接有效组合【英文标题】:Oracle inner and outer join valid combinations 【发布时间】:2015-12-16 04:08:16 【问题描述】:

在同一个查询中结合 Oracle 内连接和外连接是否有效:

select b.col1, c.col2, sum(d.col1), sum(e.col1) from 
a  
inner join b on a.xxx = b.xxx 
inner join c on a.yyy = c.yyy 
left join d on b.aaa = d.aaa and c.bbb = d.bbb
left join e on b.aaa = e.bbb and c.aaa = e.bbb
group by b.col1, c.col2

【问题讨论】:

是的,它是有效的。我觉得你的 group by 有问题?是吗? 是的,总和并没有像我预期的那样加起来。 啊,没关系。 Sum 正在运行 - 我遇到了与查询无关的其他问题。 为什么你认为它无效? @MarcusLeon,以下任何答案对您有帮助吗? 【参考方案1】:

是的,您可以按照您认为适合查询的方式组合内连接、左连接和右连接。只要确保您了解内连接、左连接和外连接的含义。几个博客很好地描述了连接:http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ 和 http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins

【讨论】:

【参考方案2】:

在 sum(d.col1) 和 sum(e.col1) 值中忽略外连接空值。

Why SUM(null) is not 0 in Oracle?

如果您的空外连接结果需要备用默认值,请考虑使用 NVL 和类似方法。

Sum columns with null values in oracle

【讨论】:

【参考方案3】:

请试试这个,所有非聚合列都应该在 group by 子句中。

 select b.col1, c.col2, sum(d.col1), sum(e.col1) from 
    a  
    inner join b on a.xxx = b.xxx 
    inner join c on a.yyy = c.yyy 
    left join d on b.aaa = d.aaa and c.bbb = d.bbb
    left join e on b.aaa = e.bbb and c.aaa = e.bbb
    group by b.col1, c.col2

【讨论】:

谢谢,我更新了我的示例。我实际上是这样做的——但在我的例子中犯了一个错误。

以上是关于Oracle 内连接和外连接有效组合的主要内容,如果未能解决你的问题,请参考以下文章

sql 内连接和外连接的是啥意思?

sql server 2005 中的内连接和外连接 怎么理解?

SQL中内连接和外连接的区别

sql左连接 右连接 内连接 外连接都是啥

SQL内连接与外连接用法与区别

SQL内连接与外连接用法与区别