问:我有一个有关用综合连接语句在不同范畴获取行数值的问题:
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值不算在内,所以得到的结果就是零。
原文出处:http://searchoracle.techtarget.com/expert/KnowledgebaseAnswer/0,289625,sid41_gci1338359,00.html