当前位置: 代码迷 >> Oracle开发 >> oracle 不同表联合查询,该怎么解决
  详细解决方案

oracle 不同表联合查询,该怎么解决

热度:93   发布时间:2016-04-24 06:35:02.0
oracle 不同表联合查询
比如我有三个表A, B, C

A中三个字段: _DATE ,  _PEOPLE, _VALUE_A;
B中三个字段: _DATE ,  _PEOPLE, _VALUE_B;
C中三个字段: _DATE ,  _PEOPLE, _VALUE_C;

现在要将满足条件_DATE 和_PEOPLE的A,B,C中的记录查出来连接上,没有记录的就用null代替,
如何做,
join?

------解决思路----------------------
使用full join连接
------解决思路----------------------
FULL JOIN 的写法就不写了,写一种其他的实现方式
SELECT _DATE,_PEOPLE, MAX(_VALUE_A) AS _VALUE_A, MAX(_VALUE_B) AS _VALUE_B, MAX(_VALUE_C) AS _VALUE_C
FROM 
(
SELECT _DATE,_PEOPLE,_VALUE_A,NULL AS _VALUE_B,NULL AS _VALUE_C FROM A
UNION ALL
SELECT _DATE,_PEOPLE,NULL AS _VALUE_A,_VALUE_B,NULL AS _VALUE_C FROM B
UNION ALL
SELECT _DATE,_PEOPLE,NULL AS _VALUE_A,NULL AS _VALUE_B,_VALUE_C FROM C
)
GROUP BY _DATE ,  _PEOPLE

------解决思路----------------------
SELECT NVL(T._DATE,C._DATE) _DATE,NVL(T._PEOPLE,C._PEOPLE) _PEOPLE,T._VALUE_A,T._VALUE_B,C._VALUE_C
FROM
(SELECT  NVL(A._DATE,B._DATE) _DATE,NVL(A._PEOPLE,B._PEOPLE) _PEOPLE,A._VALUE_A,B._VALUE_B
FROM A FULL JOIN B
ON A._DATE=B._DATE AND A._PEOPLE=B._PEOPLE) T
FULL JOIN C
ON T._DATE=C._DATE AND T._PEOPLE=C._PEOPLE

------解决思路----------------------
引用:
join on的=条件是不是连接关系的?是和where里面的=一个意思么?谢谢

是的,都是起到表与表直接的连接作用,不过where条件中的=还能作为条件对结果进行筛选。

------解决思路----------------------
引用:
join on的=条件是不是连接关系的?是和where里面的=一个意思么?谢谢

注意了,人家帮你写的是full join,有关full joion,left join,right join. 你可以去网上收一下,看看它们的用法和使用效果
------解决思路----------------------
ON后面的条件和where后面效果还是有点区别的
sql语句执行的时候是先根据on条件进行连接,然后再根据where进行筛选

如果是内连接的话,写在哪都无所谓
如果是外连接或是全连接的话,写在两个位置的查询结果是有差别的
  相关解决方案