`

oracle 外连接易错的地方

 
阅读更多
两条SQL:
1、select * from tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’
2、select * from tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)
第一条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 20 BBB
2 20 20 CCC
3 30 (null) (null)

2、再对中间表过滤
where 条件:
tab2.name=’AAA’
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA


第二条SQL的过程:
1、中间表
on条件:
tab1.size = tab2.size and tab2.name=’AAA’
(条件不为真也会返回左表中的记录)
tab1.id tab1.size tab2.size tab2.name
1 10 10 AAA
2 20 (null) (null)
3 30 (null) (null)
其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。

JOIN联表中ON,WHERE后面跟条件的区别
对于JOIN的连表操作,这里就不细述了,当我们在对表进行JOIN关联操作时,对于ON和WHERE后面的条件,不清楚大家有没有注意过,有什么区别,可能有的朋友会认为跟在它们后面的条件是一样的,你可以跟在ON后面,如果愿意,也可以跟在WHERE后面。它们在ON和WHERE后面究竟有一个什么样的区别呢?
在JOIN操作里,有几种情况。LEFT JOIN,RIGHT JOIN,INNER JOIN等。
为了清楚的表达主题所描述的问题,我简要的对LEFT,RIGHT,INNER这几种连接方式作一个说明。
下面就拿一个普通的博客系统的日志表(post)和分类表(category)来描述吧。
这里我们规定有的日志可能没有分类,有的分类可能目前没有属于它的文章。
1.    LEFT JOIN:
(保证找出左联表中的所有行)
查出所有文章,并显示出他们的分类:

SELECT p.title,c.category_name FROM post p LEFT JOIN category c ON p.cid = c.cid

2.    RIGHT JOIN:
(保证找出右联表中的所有行)
查询所有的分类,并显示出该分类所含有的文章数。

SELECT COUNT(p.id),c.category_name FROM post p RIGHTJOIN  category c ON p.pid = c.cid

3.    INNER JOIN
(找出两表中关联相等的行)
查询有所属分类的日志。(即那些没有所性分类的日志文章将不要我们的查询范围之内)。

SELECT p.title,c.category_name FROM post p INNER JOIN category c ON p.cid = c.cid.这种情况和直接两表硬关联等价。
现在我们回过头来看上面的问题。
对于第一种情况,如果我们所ON 的条件写在WHERE 后面,将会出现什么情况呢?
即:

SELECT p.title,c.category_name FROM post p LEFT JOIN category c WHERE  p.cid = c.cid对于第二种情况,我们同样按照上面的书写方式。

SELECT COUNT(p.id),c.category_name FROM post p RIGHTJOIN  category c WHERE p.pid = c.cid
如果运行上面的SQL语句,就会发现,它们已经过滤掉了一些不满足条件的记录,可能在这里,大家会产生疑问了,不是用了LEFT和RIGHT吗?它们可以保证左边或者右边的所有行被全部查询出来,为什么现在不管用了呢?对于出现这种的问题,呵呵!是不是觉得有些不可思议。
出现这种的问题,原因就在WHERE和ON这两个关键字后面跟条件。
好了,现在我也不调大家味口了,给大家提示答案吧。
对于JOIN参与的表的关联操作,如果需要不满足连接条件的行也在我们的查询范围内的话,我们就必需把连接条件放在ON后面,而不能放在WHERE后面,如果我们把连接条件放在了WHERE后面,那么所有的LEFT,RIGHT,等这些操作将不起任何作用,对于这种情况,它的效果就完全等同于INNER连接。对于那些不影响选择行的条件,放在ON或者WHERE后面就可以。
记住:所有的连接条件都必需要放在ON后面,不然前面的所有LEFT,和RIGHT关联将作为摆设,而不起任何作用。


#########################
wiki上关于各种类型join的一个解释
http://en.wikipedia.org/wiki/Join_%28SQL%29#Equi-join
#########################
说白了就是当使用INNER JOIN的时候,过滤条件放在ON和WHERE后面没什么区别。
但是如果使用了LEFT JOIN,RIGHT JOIN,FULL JOIN的时候,表的连接条件需要放在ON后面,因为这样才能发挥出LEFT,RIGHT,FULL的作用(把不符合条件的结果集也选中),一些无关紧要的过滤条件可以放在WHERE后面。如果把连接条件也放到WHERE后面,那么你可能会发现LEFT,RIGHT,FULL没起什么作用,那些你想刻意留下来的不符合连接条件的记录依然被过滤掉了。
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    ORACLE+UNIX易错问题集锦

    "ORACLE+UNIX易错问题集锦"这个文档集合可能包含了在实际操作中遇到的各种故障及其解决策略。以下是一些可能包含在文档中的关键知识点: 1. **Oracle在UNIX上的安装问题**:Oracle数据库的安装过程在UNIX环境下可能...

    ORACLE_UNIX易错问题集锦

    - **网络延迟与连接超时**:Oracle数据库在分布式环境中运作时,网络问题可能导致连接不稳定或通信延迟。确保网络配置正确,包括TCP/IP参数调整,如TCP缓冲区大小和超时设置。 7. **日志管理** - **redo log切换...

    oracle客户端连接远程服务器

    标题中提到的“Oracle客户端连接远程服务器”,是指使用Oracle数据库客户端软件来建立与远程Oracle数据库服务器的连接。Oracle数据库是一种广泛使用的商业数据库系统,它支持多用户并发访问并保证数据的一致性,适用...

    强制释放Oracle数据连接方案

    ### 强制释放Oracle数据连接方案 在日常的数据库管理工作中,我们经常遇到数据库连接超限的情况,这通常是由于大量的数据库连接未被正确关闭或回收所导致的。本文将详细介绍如何查看并调整Oracle数据库的连接数量...

    oracle数据库连接工具

    oracle数据库连接工具:toad oracle 11

    易语言oracle数据库连接模块源码

    在易语言中,开发Oracle数据库连接模块是为了实现对Oracle数据库的高效、便捷操作。Oracle数据库是全球广泛使用的大型关系型数据库管理系统,适用于处理大量数据和并发事务。 Oracle数据库连接模块的核心在于如何...

    oracle远程连接服务器出现 ORA-12170 TNS:连接超时 解决办法

    错误描述:oracle远程连接服务器出现 ORA-12170 TNS:连接超时 错误检查:有很多是oracle自身安装的问题,但是我这里服务器配置正常,监听正常,服务正常,远程可以ping通服务器。 这里主要是防火墙问题,解决办法: ...

    oracle 左连接 右连接学习

    左连接是一种外连接,它返回左表中的所有记录,并将右表中的记录匹配到左表中。如果右表中没有匹配的记录,将以 null 值代替。例如: SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name ...

    oracle总结易错点

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其复杂性和深度使得学习过程中难免会遇到一些易错点。本文将针对这些易错点进行详细的解析,帮助Oracle初学者和有一定基础的用户巩固理解,提高问题解决能力...

    geoserver2.14.0 oracle 数据库连接

    在GeoServer中连接Oracle数据库,需要确保系统已安装了Oracle数据库驱动,这通常通过JDBC(Java Database Connectivity)实现。在这个案例中,`gt-jdbc-oracle-20.0.jar`文件是一个Oracle JDBC驱动包,它使得Java...

    oracle遇到连接空闲例程

    除了上述步骤外,还应该考虑以下几点来避免未来再次出现连接空闲例程的问题: - **调整会话超时设置**:可以通过调整`IDLE_TIME`参数来控制会话的空闲时间,减少连接被标记为闲置的可能性。 - **定期检查连接池**:...

    Oracle客户端连接Oracle服务器.docx

    Oracle客户端连接Oracle服务器是...以上就是Oracle客户端连接Oracle服务器的主要知识点,包括配置步骤、连接工具的使用以及数据库管理中的基本概念。理解并熟练掌握这些内容对于日常的数据库管理和开发工作至关重要。

    Oracle 数据库连接字符串大全教程

    Oracle 数据库连接字符串大全教程旨在提供了完整的 Oracle 连接字符串大全,涵盖了异地或服务器数据库连接、ODBC 连接、OLE DB 连接、Oracle.DataAccess.Client.OracleConnection 连接等多种连接方式。 一、 Oracle...

    Oracle数据库左外连接

    Oracle连接有多中,我是在平常开发项目过程中用到的Oracle左连接进行了简单的阐述。

    sap 与 oracle数据库的连接

    SAP与Oracle数据库的连接 SAP系统与Oracle数据库的连接是SAP开发中的一个重要步骤,该连接允许SAP系统访问Oracle数据库中的数据,实现数据交换和共享。在本文中,我们将详细介绍SAP开发中模块连接Oracle数据库的...

    Oracle Spatial与ArcGIS连接

    ### Oracle Spatial与ArcGIS连接知识点解析 #### 一、引言 随着信息技术的发展,空间数据管理变得日益重要。许多组织正在转向使用Oracle Spatial作为其核心数据库系统,这主要是因为Oracle Spatial能够提供强大的...

    oracle数据库连接测试软件

    DataBaseHelper帮助类中包含了默认的连接字符串格式,修改完IP和用户名密码就可以使用,也可以在连接的时候直接输入连接字符串和sql语句。可以直接使用release下的exe 建议使用升级过的版本:...

Global site tag (gtag.js) - Google Analytics