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

 
   | |

导读:要解决这个问题,你只需要写一个LEFT OUTER JOIN查询(和以前一样)。你的查询和用"(+)"标记的旧版的外部连接一起,表面上允许rand_schedule行在没有……

关键词:Oracle SQL LEFT OUTER JOIN 连续数零

Rudy Limeback
Rudy Limeback,Oracle顾问。他从事数据库系统工作25年,自1987年开始从事基于SQL关系数据库,著有《实用网站数据库设计》一书,书中有大量关于SQL文章。
正在加载数据...

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


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
 
作者:Rudy Limeback     译者:April    
 
 
 
 
 

Oracle SQL

 
SELECT子句通常是一个SELECT语句的第一个子句。它标识出你所想要包含到结果集中的列。这些列是从在FROM子句中指定的基表中返回的。
 
没有ORDER BY子句,Oracle不会保证行显示的顺序。它们可能是按照你想要的顺序排列,但也可能不是。
 
Toad For Oracle的产品策略就是为Oracle开发一款工具,它可以满足不同人的不同需求,比如DBA、开发人员、分析师以及管理者等等。
 
据Toad For Oracle产品经理John Pocknell所说,这次发布的Toad 10致力于生产力的概念,其中包括了:灵活性、易用性、自动化和协作等内容。
 
如何找到会话中正在运行的存储过程?你需要找到会话中正在运行的SQL语句,存储过程就是以SQL语句的形式出现的。

热门技术手册排行

 

在本次的技术手册中,我们为您提供了PL/SQL的基础知识以及专家指导,包括了PL/SQL中的数据类型简介、PL/SQL函数与触发器以及PL/SQL中的存储过程等,相信您无论是高手还是菜鸟都可以获得有帮助的信息。

 

本系列文章由三部分组成,为Oracle数据库管理员(DBA)面试成功的必备手册。本专题内容囊括从DBA最初的面试开始,从写“杀手简历”到求职信、到面试过程到Oracle认证再到上升到公司高层最后到你成为公司里的明星DBA。专家为你一一指点迷津,最终让你登上成功的宝座。

 

在本次技术手册中,我们将对SQL Server存储过程的调试进行详细的介绍,包括了基础的调试方法和在调试过程中出现的T-SQL性能问题和解决方法。

 

要成为一名DBA,你需要具备哪些素质?DBA的薪酬待遇如何?DBA的职业道路究竟可以走向何方?我们将在本次的技术手册中为您一一解答。

 

本技术专题主要围绕sql server设计这个话题展开,侧重介绍了sql server集簇索引的设计、如何创建sql server索引、如何优化索引、索引的能与不能、处理sql server 2000索引碎片技巧以及维护sql server索引以实现查询优化等等。

查看更多
 
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录