用LEFT OUTER JOIN查询在SQL中获得连续数零

日期: 2008-11-19 作者:Rudy Limeback翻译:April 来源:TechTarget中国 英文

问:我有一个有关用综合连接语句在不同范畴获取行数值的问题:


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

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

翻译

April
April

相关推荐