我在多个表上使用多个查询,我想将这些查询组合成一个查询以提高效率和速度。
我的表格是这样的:
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
我一直在尝试弄清楚如何使用一个 sql 语句或每个时间戳一个 sql 语句来生成上述数组。我尝试过连接、联合、案例陈述等,但没有成功。我需要在没有匹配结果的列中显示“NULL”或空白值这一事实似乎使事情变得复杂。
我正在使用 PostgreSQL 8.3.6。
如有任何帮助,我们将不胜感激。
最佳答案
我找到的最接近的解决方案是使用 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)
关于sql - 在单个查询中具有不同约束的不同表上的多个 select 语句,没有结果显示为空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7180074/