外联接的基本概念

来源:互联网 发布:金蝶2008r2数据库安装 编辑:程序博客网 时间:2024/04/29 20:02
 

规则:

左外连接右带+
右外连接左带+
谁少谁带 +
遇到外连接的情况,可能表中的数据为空,where条件主表要注意用 or  ,,is null

select A.AreaName,
      P.CityName,
      sum(J.TotalTest),
      sum(J.ValidTest),
      sum(J.ExvalueTest),
      avg(J.NetScValue),
       (sum(J.ValidTest)-sum(J.ExvalueTest))/Decode(sum(J.ValidTest),0,1,sum(J.ValidTest))*100,
      P.Weight
       from StatGroupInfo G,
      StatGroupDetail GD,
          AreaInfo A,
          AreaTestPath P,
          NetScPerfD J
      where G.StatGroupCode = GD.StatGroupCode and
      GD.AreaCode = A.AreaCode and
      A.AreaCode=P.AreaCode and
      (J.NetScItemCode='$NetScItemArr[$cnt]' or J.NetScItemCode is null ) and
      
P.CityCode = J.Resid(+) and    谁少谁带 +
      P.ChangeType = 0 and
      P.IsTest = 'Y' and
      G.StatGroupCode='$StatGroupCode' and
      (J.NetScDate between '$BeginDate' and '$EndDate' or J.NetScDate is null)
      group by A.AreaName, P.CityName, P.Weight
      order by 1,2

遇到外连接的情况,可能表中的数据为空,要注意用 or

一般的相等连接:
select * from a, b where a.id = b.id;
这个就属于内连接。
 
对于外连接:
Oracle中可以使用“(+) ”来表示,9i可以使用LEFT/RIGHT/FULL OUTER JOIN 
 
LEFT OUTER JOIN:左外关联 
SELECT e.last_name, e.department_id, d.department_name 
FROM employees e 
LEFT OUTER JOIN departments d 
ON (e.department_id = d.department_id); 

左外连接右带+

有外连接左带+ 

等价于 
SELECT e.last_name, e.department_id, d.department_name 
FROM employees e, departments d 
WHERE e.department_id=d.department_id(+) 
结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录。 
 
RIGHT OUTER JOIN:右外关联 
SELECT e.last_name, e.department_id, d.department_name 
FROM employees e 
RIGHT OUTER JOIN departments d 
ON
(e.department_id = d.department_id); 
等价于 
SELECT e.last_name, e.department_id, d.department_name 
FROM employees e, departments d 
WHERE e.department_id(+)=d.department_id 
结果为:所有员工及对应部门的记录,包括没有任何员工的部门记录。 
 
FULL OUTER JOIN:全外关联 
SELECT e.last_name, e.department_id, d.department_name 
FROM employees e 
FULL OUTER JOIN departments d 
ON
(e.department_id = d.department_id); 
结果为:所有员工及对应部门的记录,包括没有对应部门编号department_id的员工记录和没有任何员工的部门记录。

ORACLE8i是不直接支持完全外连接的语法,也就是说不能在左右两个表上同时加上(+),下面是在ORACLE8i可以参考的完全外连接语法
select t1.id,t2.id from table1 t1,table t2 where t1.id=t2.id(+)
union
select t1.id,t2.id from table1 t1,table t2 where t1.id(+)=t2.id