3.6 向查询中增加联接而不影响其他联接

问题;已经有了一个查询可以返回所需要的值,还需要得到其他的信息,但当加入这些信息时,发现原始结果集中的数据有丢失。例如,要返回所有的员工信息,他们工作部门的地点及所获得的奖励。

select e.ename,d.loc from emp e,dept d
    where e.deptno = d.deptno

现在将每个员工所获得的奖励的日期列加入到结果集中,但是连接到emp_bonus表后,所返回的记录数要比所希望的要少,因为并不是每个员工都有奖励:

select e.ename,d.loc,eb.received from emp e,dept d,emp_bonus eb
    where e.deptno = d.deptno and e.empto=eb.empno

解决方案:
可以使用外联结来获得这些附加的信息,并且原始查询中的数据也不会丢失。首先,联接表emp和dept来得到所有员工姓名和他们工作的部门,然后与表emp_bonus进行外联接来返回获得奖励的日期(对获得奖励的员工)。
select e.ename ,d.loc ,eb.received
    from emp e join dept d
        on (e.deptno=d.deptno)
    left join emp_bonus eb
        on (e.enmae=eb.ename)
order by 2

还可以使用标量子查询(放在select列表中的子查询)来模仿外联结:

select e.ename,d.loc
    (select eb.received from emp_bonus eb
        where eb.empno=e.empno)as received
    from emp e,dept d
where e.deptno = d.deptno
order by 2

这种标量子查询的解决方案可以在所有的平台上运行

讨论:
外联接可以返回一个表中所有行及与另一个表中匹配的行,可以看前一节有关外联结的另一个例子。因为使用外联结可以解决这个问题。次查询会返回不用外联结时应返回的所有行,并且,如果存在新加的数据也一并返回。

使用标量子查询也是解决这种问题的一个方便的技巧。因为它不需要修改已有的正确联接。使用标量子查询是不会危及到当然结果集而获得额外数据的一种简单方法。当使用标量子查询时,继续确保返回的是标量值(单个值)。如果在select列表中的子查询的返回值超过一行,将会出现错误。

时间: 2024-11-02 01:41:23

3.6 向查询中增加联接而不影响其他联接的相关文章

3.06 向查询中增加联接而不影响其他联接

问题:已经有了一个查询可以返回所需要的值,还需要得到其他的信息,但当加入这些信息时,发现原始结果集中的数据有丢失.例如,要返回所有的员工信息,他们工作部门的地点及所获得的奖励.在这个问题中,表EMP_BONUS包含如下内容: select * from emp_bonus;+-------+------------+------+| empno | RECEIVED   | TYPE |+-------+------------+------+|  7269 | 2005-05-14 | 1  

因在缓存对象中增加字段,而导致Redis中取出缓存转化成Java对象时出现反序列化失败的问题

背景描述 因为业务需求的需要,我们需要在原来项目中的一个DTO类中新增两个字段(我们项目使用的是dubbo架构,这个DTO在A项目/服务的domain包中,会被其他的项目如B.C.D引用到).但是这个DTO对象已经在Redis缓存中存在了,如果我们直接向类中增加字段而不做任何处理的话,那么查询操作查出来的缓存对象就会报反序列化失败的错误,从而影响正常的业务流程,那么来看一下我的解决方案吧. 升级缓存版本号 我们的正式环境和预发布环境是共用Redis和Mysql.如果修改了DTO且没有加@Json

SQL语句技巧:查询存在一个表而不在另一个表中的数据记录

原文:SQL语句技巧:查询存在一个表而不在另一个表中的数据记录 方法一(仅适用单个字段)使用 not in ,容易理解,效率低 select A.ID from A where A.ID not in (select ID from B) 方法二(适用多个字段匹配)使用 left join...on... , "B.ID isnull" 表示左连接之后在B.ID 字段为 null的记录 select A.ID from A left join B on A.ID=B.ID where

sql 在查询结果中增加标记字段

有时候需要在查询结果中增加该表在数据库中没有的字段作为标记字段,在sql中直接加: select *, 'xiaojiayu' as mark from user_info 查询结果会在原表增加一个mark字段,值均为:xiaojiayu. 版权声明:本文为博主原创文章,未经博主允许不得转载.

为何在查询中索引未被使用 (Doc ID 1549181.1)

* 为何在查询中索引未被使用 (Doc ID 1549181.1) To Bottom 文档内容 用途   排错步骤   快速检查   表上是否存在索引?   索引是否应该被使用?   索引本身的问题   索引列或者索引的前置列是否在单表(non-join)查询的 Where 条件中(predicate list)?   索引列是否用在连接谓词中(join predicates)?   索引列在 IN 或者多个 OR 语句中?   索引列是否被函数修改?   隐式类型转换(implicit ty

SQL语法精讲(包括建库、建表、建视图、查询、增加、删除、)

SQL语法精讲(包括建库.建表.建视图.查询.增加.删除.修改) SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:

在Oracle Spatial中增加Web Mercator投影坐标系

参考资料: 1. 最重要的参考文章,基本上就是按这个做的!!!:https://www.inf.unibz.it/dis/wiki/doku.php?id=students:minnerebner:oracle:addingsrid . 2. 实例参考:http://www.cnblogs.com/cleverxy/archive/2012/04/28/2474563.html 步骤1是从0开始,这个应该有一些基础了,可以对照看一下里面对8801~8807.9802~9807的解释,然后再去数据

.Net Web产品中增加自己的功能和代码?

背景: 最近有一个项目,一个朋友找了一个网上比较成熟的CMS系统(动易),让我给他增加一些功能,这个产品功能挺多,但是没有源代码.按照以前的做法,就是直接反编译他的dll,生成源代码,然后在源代码的基础上修改和完善自己的功能.但是研究了一下这个产品,bin下面的DLL非常多,有主要的,还有辅助的.如果每个dll都反编译,简直不现实. ? 用发编译工具?ILSpy打开里面几个主要的dll,发现还加壳混淆了,用De4Dot反混淆出来.里面的代码还是非常清晰,但是如果每个dll都这样搞,岂不累死. ?

编写高质量代码改善C#程序的157个建议——建议31:在LINQ查询中避免不必要的迭代

建议31:在LINQ查询中避免不必要的迭代 无论是SQL查询还是LINQ查询,搜索到结果立刻返回总比搜索完所有的结果再将结果返回的效率要高. 示例代码: class MyList : IEnumerable<Person> { //为了演示需要,模拟了一个元素集合 List<Person> list = new List<Person>() { new Person(){ Name = "Mike", Age = 20 }, new Person()