问:我有一个有关用综合连接语句在不同范畴获取行数值的问题:
select rs.stratum_id stratum, rs.treatment_group_id treatment_name, count(rs.patient_id) countz from rand_schedule rs, strata s, treatment_groups t where rs.stratum_id = s.stratum_id (+) and rs.treatment_group_id = t.treatment_group_id (+) and rs.status = ‘U’ group by rs.stratum_id, rs.treatment_group_id order by countz desc; |
该查询返回有行的三个stratum/treatment组合,但是没有返回没有行的一个组合。我尝试用对该值用NVL,但是根本就没有用,一旦碰到没有行的范畴它就停止运行程序。有没有一种办法能报告出那些没有行的值?
答:是的,你只需要写一个LEFT OUTER JOIN查询(和以前一样)。你的查询和用”(+)”标记的旧版的外部连接一起,表面上允许rand_schedule行在没有strata或treatment_groups表匹配时还能存在。所以在有外键的时候当然就行不通。
SELECT rs.stratum_id stratum , rs.treatment_group_id treatment_name , COUNT(rs.patient_id) countz FROM strata s CROSS JOIN treatment_groups t LEFT OUTER JOIN rand_schedule rs ON rs.stratum_id = s.stratum_id AND rs.treatment_group_id = t.treatment_group_id AND rs.status = ‘U’ GROUP BY rs.stratum_id , rs.treatment_group_id ORDER BY countz DESC; |
CROSS JOIN首先能够获取所有的strata和treatment_groups组合。然后,对所有这些组合中的每个组合都用LEFT OUTER JOIN找到rand_schedule表里相对应的行。如果没有这样的行存在的话,这些组合就当然要返回NULL。因此,COUNT集合函数就可以来计算这些组合,但是NULLs值不算在内,所以得到的结果就是零。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
翻译
相关推荐
-
解答Oracle LEFT JOIN和LEFT OUTER JOIN的区别
在Oracle数据库中,LEFT JOIN和LEFT OUTER JOIN之间有什么区别?关键词是否只是用来强调连接特性?专家纷纷给出了自己的解答。
-
在SQL中使用SELECT进行算术运算
如何在不使用SQL算术运算符而仅仅使用SELECT的情况下完成数学运算,Oracle数据库专家给出了解答。
-
分析并行SQL中的各个元素
并行度(DOP)定义了将被创建的执行并行流的数量。最简单的情况,它可以理解为分配为支持你SQL执行的并行伺服进程的数量。
-
在Oracle里提高SQL执行效率的三种方法
Oracle提供了多种方法用于减少花在剖析Oracle SQL表达式上的时间,在执行带有大量执行计划的复杂查询时剖析过程会拖累系统的性能。