比如我有三个表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
------解决思路----------------------
是的,都是起到表与表直接的连接作用,不过where条件中的=还能作为条件对结果进行筛选。
------解决思路----------------------
注意了,人家帮你写的是full join,有关full joion,left join,right join. 你可以去网上收一下,看看它们的用法和使用效果
------解决思路----------------------
ON后面的条件和where后面效果还是有点区别的
sql语句执行的时候是先根据on条件进行连接,然后再根据where进行筛选
如果是内连接的话,写在哪都无所谓
如果是外连接或是全连接的话,写在两个位置的查询结果是有差别的