大型网站建设公司有哪些,网站dns服务,外包做网站多少钱,网站前台乱码我们都知道#xff0c;PL/SQL中实现外连接#xff0c;除了可以用关键词OUTER JOIN外#xff0c;还可以用Oracle的外连接符号()。对于这个外连接符号()#xff0c;虽然看到书上说#xff1a;使用()进行外连接时#xff0c;where条件中#xff0c;对于附表的字段都应带上(…我们都知道PL/SQL中实现外连接除了可以用关键词OUTER JOIN外还可以用Oracle的外连接符号()。对于这个外连接符号()虽然看到书上说使用()进行外连接时where条件中对于附表的字段都应带上()。但在实际应用中发现对它的理解还远远不够。现在结合实际的SQL语句让我们再仔细地瞧瞧这个()的真面目吧。首先我们来看一下Oralce的《SQL Reference》对它的一点说明。—————————————————————————————————————If the WHERE clause contains a condition that compares a column from table B with aconstant, then the () operator must be applied to the column so that Oracle returnsthe rows from table A for which it has generated nulls for this column. OtherwiseOracle returns only the results of a simple join.注table A为主表table B为附表。—————————————————————————————————————现在有以下两张表表A 员工(EMPLOYEE)EMP_NOEMP_NAMEJOBDEPT_NO11HXFPRESIDENT222SCOTTCLERK133SMITHSALESMAN344JOHNMANAGER表B 部门(DEPARTMENT)DEPT_NODEPT_NAMELOCATIONDEL_FLG11ACCOUNTINGHANGZHOU022RESEARCHBEIJING033OPERATIONSSHANGHAI1其中部门表中字段DEL_FLG为0表示该条记录已删除是无效记录反之相反。如果需要找出表A中的所有记录并关联上表B中的有效记录我们很可能会写出以下三种SQL语句语句一SELECTA.EMP_NAME, A.JOB, B.*FROMEMPLOYEE A, DEPTMENT BWHEREA.DEPT_NO B.DEPT_NO()ANDB.DEL_FLG() 0该语句利用Oracle的外连接符号并用条件B.DEL_FLG() 0限定表B种的有效记录。也有人可能会写成语句二语句二SELECTA.EMP_NAME, A.JOB, B.*FROMEMPLOYEE A, DEPTMENT BWHEREA.DEPT_NO B.DEPT_NO()ANDB.DEL_FLG 0语句二中表B中的字段DEL_FlG没带外连接符号。还有种写法如语句三语句三SELECT*FROM(SELECTA.EMP_NAME, A.JOB, B.*FROMEMPLOYEE A, DEPTMENT BWHEREA.DEPT_NO B.DEPT_NO())WHEREDEL_FLGIS NULLORDEL_FLG 0该语句首先将表A和表B通过外连接关联起来然后对表B中的字段DEL_FlG进行限定因为要关 联表B中的有效字段所以有条件DEL_FLG 0又因为是左连接所以会有结果集中表B的记录为空的情况所以又加上条件DEL_FLG IS NULL。粗粗看起来以上三种SQL语句的写法都有道理没有问题。那我们再来看下它们的执行结果语句一的执行结果EMP_NAMEJOBDEPT_NODEPT_NAMELOCATIONDEL_FLG1SCOTTCLERK1ACCOUNTINGHANGZHOU02HXFPRESIDENT2RESEARCHBEIJING03JOHNMANAGER4SMITHSALESMAN语句二的执行结果EMP_NAMEJOBDEPT_NODEPT_NAMELOCATIONDEL_FLG1HXFPRESIDENT2RESEARCHBEIJING02SCOTTCLERK1ACCOUNTINGHANGZHOU0语句三的执行结果EMP_NAMEJOBDEPT_NODEPT_NAMELOCATIONDEL_FLG1SCOTTCLERK1ACCOUNTINGHANGZHOU02HXFPRESIDENT2RESEARCHBEIJING03JOHNMANAGER我们发现三条语句的执行结果截然不同。那到底哪一个是对的呢首先我们应该清楚要求是以表A为主表表B为附表的外连接根据外连接的定义就要求选出表A中的所有记录显然语句二和三的结果就不符号这个要求。其次我们要求选出表B中的有效记录出现在结果集中的表B的字段DEL_FLG的值只能是0。由此可见语句一的执行结果是正确的。那么语句二和三是怎么回事呢在语句二中虽然对两张表中的相关字段进行了外连接但是对附表B中的字段DEL_FLG限定条件的时候没有使用外连接符号导致这个连接变成了全连接。语句三的话最具有迷惑性表面看上去很有道理但实际上它不是真正的外连接它把跟附表B中的无效记录相关联的表A中的记录也排除在外了这是不符号外连接要求的。最重要的是我们要明白对于外连接有主表和附表之分主表中的记录要全部选出而附表中的记录可有可无。转自http://blog.csdn.net/feifei666888/article/details/5653601