2011-08-24 4 views
1

여러 테이블에서 여러 쿼리를 사용하여 효율성 및 속도를 단일 쿼리로 결합했습니다.단일 쿼리에서 다른 제약 조건을 가진 다른 테이블에 대한 여러 SELECT 문은 결과를 null로 표시하지 않습니다.

내 표는 다음과 같다 :

m1 
------------------------------------------------------------------------ 
id | time | min | max  | mean 
------------------------------------------------------------------------ 
a  00:10:00 1  5  3 
a  00:20:00 2  6  4 
a  00:30:00 3  7  5 
a  00:40:00 4  8  6 
b  00:40:00 11  15  13 
b  00:50:00 21  26  24 
c  00:10:00 21  27  25 

m2 
------------------------------------------------------------------------ 
id | time | min | max  | mean 
------------------------------------------------------------------------ 
a  00:30:00 22  44  33 
a  00:40:00 33  55  44 
a  00:50:00 44  66  55 
b  00:20:00 1  4  2 
b  00:30:00 1  3  2 
b  00:30:00 2  5  4 
c  00:20:00 6  7  6 

m3 
------------------------------------------------------------------------ 
id | time | min | max  | mean 
------------------------------------------------------------------------ 
b  00:10:00 11  15  13 
b  00:20:00 21  26  14 
c  00:00:00 21  27  25 

내 쿼리

는 다음과 같이 :

SELECT min,max,mean FROM m1 WHERE id='a' AND time='00:10:00' 
SELECT min,max,mean FROM m2 WHERE id='a' AND time='00:10:00' 
SELECT min,max,mean FROM m3 WHERE id='a' AND time='00:10:00' 
SELECT min,max,mean FROM m1 WHERE id='a' AND time='00:20:00' 
SELECT min,max,mean FROM m2 WHERE id='a' AND time='00:20:00' 
SELECT min,max,mean FROM m3 WHERE id='a' AND time='00:20:00' 
SELECT min,max,mean FROM m1 WHERE id='a' AND time='00:30:00' 
SELECT min,max,mean FROM m2 WHERE id='a' AND time='00:30:00' 
SELECT min,max,mean FROM m3 WHERE id='a' AND time='00:30:00' 
SELECT min,max,mean FROM m1 WHERE id='a' AND time='00:40:00' 
SELECT min,max,mean FROM m2 WHERE id='a' AND time='00:40:00' 
SELECT min,max,mean FROM m3 WHERE id='a' AND time='00:40:00' 
SELECT min,max,mean FROM m1 WHERE id='a' AND time='00:50:00' 
SELECT min,max,mean FROM m2 WHERE id='a' AND time='00:50:00' 
SELECT min,max,mean FROM m3 WHERE id='a' AND time='00:50:00' 

나는 이러한 쿼리의 결과를 받아 수동으로 다음과 같습니다 배열에 함께 넣어 :

---------------------------------------------------------------------------------------------------------------------------------------------------------------- 
#| time | m1.min | m1.max | m1.mean | m2.min | m2.max | m2.mean | m3.min | m3.max | m3.mean 
---------------------------------------------------------------------------------------------------------------------------------------------------------------- 
1 00:10:00 1   5   3   NULL  NULL  NULL  NULL  NULL  NULL 
2 00:20:00 2   6   4   NULL  NULL  NULL  NULL  NULL  NULL 
3 00:30:00 3   7   5   22   44   33   NULL  NULL  NULL 
4 00:40:00 NULL  NULL  NULL  33   55   44   NULL  NULL  NULL 
5 00:50:00 NULL  NULL  NULL  44   66   55   NULL  NULL  NULL 

위의 배열을 생성하는 방법을 알아 냈습니다. 어느 한 sq l 문 또는 시간 스탬프 당 하나의 SQL 문. 조인, 노조, 케이스 문 등을 행운과 함께 시도했습니다. 'NULL'을 표시하거나 일치하는 결과가없는 열에 공백 값이 있어야한다는 사실은 사물을 복잡하게 만드는 것처럼 보입니다.

저는 PostgreSQL 8.3.6을 사용하고 있습니다.

도움을 주시면 감사하겠습니다. 내가 찾은

답변

2

가장 가까운 솔루션은이 같은 FULL OUTER JOIN을 사용하는 것입니다

SELECT 
    time, 
    COALESCE(m1.min::text, 'NULL') AS "m1.min", 
    COALESCE(m1.max::text, 'NULL') AS "m1.max", 
    COALESCE(m1.mean::text, 'NULL') AS "m1.mean", 
    COALESCE(m2.min::text, 'NULL') AS "m2.min", 
    COALESCE(m2.max::text, 'NULL') AS "m2.max", 
    COALESCE(m2.mean::text, 'NULL') AS "m2.mean", 
    COALESCE(m3.min::text, 'NULL') AS "m3.min", 
    COALESCE(m3.max::text, 'NULL') AS "m3.max", 
    COALESCE(m3.mean::text, 'NULL') AS "m3.mean" 
FROM 
    (SELECT time, min, max, mean FROM m1 WHERE id = 'a') m1 
    FULL JOIN 
    (SELECT time, min, max, mean FROM m2 WHERE id = 'a') m2 
    USING (time) 
    FULL JOIN 
    (SELECT time, min, max, mean FROM m3 WHERE id = 'a') m3 
    USING (time) 
ORDER BY time; 

결과 :

time | m1.min | m1.max | m1.mean | m2.min | m2.max | m2.mean | m3.min | m3.max | m3.mean 
----------+--------+--------+---------+--------+--------+---------+--------+--------+--------- 
00:10:00 | 1  | 5  | 3  | NULL | NULL | NULL | NULL | NULL | NULL 
00:20:00 | 2  | 6  | 4  | NULL | NULL | NULL | NULL | NULL | NULL 
00:30:00 | 3  | 7  | 5  | 22  | 44  | 33  | NULL | NULL | NULL 
00:40:00 | 4  | 8  | 6  | 33  | 55  | 44  | NULL | NULL | NULL 
00:50:00 | NULL | NULL | NULL | 44  | 66  | 55  | NULL | NULL | NULL 
(5 rows) 
+0

브릴리언트! 고맙습니다. 이것은 트릭을 할 것으로 보인다. 한 번에 약간의 데이터를 가져 오려면 LIMIT & OFFSET을 사용합니다. – Irina

관련 문제