sql - 在单个查询中具有不同约束的不同表上的多个 select 语句,没有结果显示为空值

标签 sql postgresql select

我在多个表上使用多个查询,我想将这些查询组合成一个查询以提高效率和速度。

我的表格是这样的:

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/

相关文章:

sql - 为什么我的 SQL 占位符没有被替换(使用 Go pq)?

mysql - 如何创建一个触发器,将相邻行中一列的数据更新 10 次?

java - Hibernate - 第一个查询总是加载更长的时间

PHP MySQL : issue selecting different columns from the same table

MySQL select 语句访问列中的部分十六进制值

php - SQL Join问题,如果第二个表为空则返回null

mysql - 通过触发器使用前一行和当前行的数据将总和插入到数据库的列中

sql - 在 postgres 中读取 XML 属性

linux - 如何将 PostgreSQL 数据库连接到 Google Cloud Compute Engine?

mysql - 将未知数量的数据显示为列名