说说左连接出现重复记录的问题,ORACLE三表查询

 举个例子两个表主表为A  从表为B

分别创建增加、删除、更新的触发器(Trigger)来达到两张表之间数据同步的目的。

ORACLE三表查询优化问题
有表A,2000多行
表B,15w行
表C,18W行
数据库为ORACLE9I。
现以表A连接表B,表B连接表C做查询,但经过分析,ORACLE始终计划是表A与C产生MERGE JOIN,要知道A表和C表是没有关联的,只能产生笛卡尔集。这样就会产生2000×180000条记录,导致查询性能大大降低,临时表巨大。
请问有什么好办法,使表A先连接表B之后再去连接表C,或者B先连接C之后再连接A都可以。
注:连接字段都建有独立索引。

A       

1:数据同步增加:

语句如下:
SELECT A.*
FROM A ,B,C
WHERE A.COL_A = B.COL_B1 AND B.COL_B2 = C.COL_C

aid place
1 大连
2 上海
3 北京

如有两张表——A表和B表,创建触发器使当A表插入数据后B表也同步插入数据。其中B表插入数据的字段需要同A表中的字段相对应。

SELECT A.*
FROM A JOIN (B JOIN C ON (B.COL_B2 = C.COL_C)) ON (A.COL_A = B.COL_B1)

 

CREATE TRIGGER 触发器名称 
ON A表
AFTER INSERT 
AS BEGIN INSERT INTO 
B表(B表字段1,B表字段2,B表字段3)
SELECT A表字段1,A表字段2,A表字段3 
FROM INSERTED
END

SELECT A.*
FROM (A JOIN B ON A.COL_A = B.COL_B1) JOIN C ON B.COL_B2 = C.COL_C

 

 

执行计划截图:
[img]]

 

2.数据同步删除:

 

如有两张表——A表和B表,创建触发器使当A表删除数据后B表也同步删除数据。其中B表与A表应有相应主键关联。

B

CREATE TRIGGER 触发器名称 
ON A表 
AFTER DELETE 
AS BEGIN DELETE B表 
WHERE 
B表主键 IN( 
SELECT A表主键
FROM DELETED) 
END

bid aid type name
1 1 学生
2 1 老师
3 2 领导
4 1 学生
5 2 老师

 

 

3.数据同步更新:

 

如有两张表——A表和B表,创建触发器使当A表数据更新后B表也同步更新数据。

 

CREATE TRIGGER 触发器名称
ON A表 
AFTER UPDATE 
AS 
update B表
SET 
B.B表字段1=A.A表字段1  
FROM
B表 AS B,INSERTED AS A   
WHERE B.B表主键=A.A表主键

 

 

下面我想查询type为学生的A表和B表的所有信息

.....

Click here to see the full blog post

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:说说左连接出现重复记录的问题,ORACLE三表查询

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。