刚开始各种连接查询也知道咋查,但一直没明白有啥用,今天在优化后台代码的时候发现该方法被调用时等待了12~16s才响应,一看妈呀4次for循环,才200多条数据,循环里面还是查询语句,于是就想能否优化sql。
基本查询逻辑是:A表是主表,B C D表是附表(存有A.ID),要查A表所有数据(A.*),条件是A.ID在B表存在,CD表查找是否有对应数据。
内连接:一一对应的关系,左边没有数据右边也没有;
外连接:主结果附上外连接表数据,全外连接则互为主副表,即只要左表有数据就要列出对应的右表数据,只要右表有数据就要列出对应的左表数据
思路:AB关系是A受控于B,准确的说应该是查询B中A.ID所对应的A表信息,应该是 内连接(两个表之间可以用运算符连接的即确切符合某个逻辑的)关系,
A表与CD表只是单纯的列出关系,有数据就列出来,没有就无所谓,从优先角度讲,如果同时查ABCD表的数据应该是先查找AB表的符合数据再根据结果查找CD数据
SELECT
A.* ,C.ID,D.ID
FROM
A,B,C,D
WHERE
A.ID = B.A.ID--(内连接)
AND A.ID = C.A.ID(+)--(加号仅oracle 、where条件 可用,且不可表示全连接)
AND A.ID = D.A.ID(+);
之前考虑的思路是用子查询,还有case when(这个还是有直接的值比较方便)或者decode()来表述是否存在状态,由于是涉及多层子查询和嵌套故作罢。
这次处理认识到:
1查询思路很重要,一次查找还是多次查找直接意味着效率,查询思路的实现也有效率问题;
2再次认识连接查询,比以前相对深刻一点点,需要好好学习;