Sql 查询多个Postgres表

Sql 查询多个Postgres表,sql,postgresql,Sql,Postgresql,我有一个查询,我想对多个表进行查询,然后在最后连接结果 这是可行的,但我希望有一种更简洁的方法来实现同样的目标 SELECT key, a.c as "TableA count", b.c as "TableB count", c.c as "TableC count", d.c as "TableD count" FROM ( SELECT key, count(key) as c FROM table_a WHERE data = 'foo' GROUP BY

我有一个查询,我想对多个表进行查询,然后在最后连接结果

这是可行的,但我希望有一种更简洁的方法来实现同样的目标

SELECT key, a.c as "TableA count", b.c as "TableB count", c.c as "TableC count", d.c as "TableD count"
FROM
(
    SELECT key, count(key) as c
    FROM table_a
    WHERE data = 'foo'
    GROUP BY key
) a
FULL OUTER JOIN
(
    SELECT key, count(key) as c
    FROM table_b
    WHERE data = 'foo'
    GROUP BY key
) b USING(key)
FULL OUTER JOIN
(
    SELECT key, count(key) as c
    FROM table_c
    WHERE data = 'foo'
    GROUP BY key
) c USING(key)
FULL OUTER JOIN
(
    SELECT key, count(key) as c
    FROM table_d
    WHERE data = 'foo'
    GROUP BY key
) d USING(key);
预期产出:

 key |  A count |  B count | C  count |  D count |
-----+----------+----------+----------+----------+
5740 |        5 |      102 |      129 |          |
5741 |     1017 |    22163 |    34888 |      218 |
5742 |      797 |    10846 |    19285 |      159 |
5743 |    24966 |   398067 |   572504 |     4772 |
5744 |    31942 |   278944 |    73628 |     5665 |
5745 |     3975 |    54322 |    98578 |     1103 |
5746 |     1353 |     4751 |    33129 |      259 |

我认为,如果使用
key
连接表,那是因为
key
位于同一个域中(至少在概念上是这样)

如果您拥有或可能拥有一个包含
PK
中所有
key
值的表,您可以做得更好

部分解 仅当
是表的主键时

SELECT key, total_a, total_b, total_c, total_d
   FROM key_table, 
        lateral (
          SELECT count(key) as total_a
          FROM table_a
          WHERE key = key_table.key AND data = 'foo'
        ) a,
        lateral (
          SELECT count(key) as total_b
          FROM table_b
          WHERE key = key_table.key AND data = 'foo'
        ) b,
        lateral (
          SELECT count(key) as total_c
          FROM table_c
          WHERE key = key_table.key AND data = 'foo'
        ) c,
        lateral (
          SELECT count(key) as total_d
          FROM table_d
          WHERE key = key_table.key AND data = 'foo'
        ) d
    WHERE total_a IS NOT NULL OR total_b IS NOT NULL OR  total_c IS NOT NULL OR  total_d IS NOT NULL
    ORDER BY key
变模型解 另一种解决方案是更改在同一个表中包含表数据的数据模型。对于现有查询,可以使用视图。如果表在同一个域(例如不同国家的城市)中,且列相同(或差异最小),则这是一个很好的解决方案

新表必须有一个新字段
源数据
,其值为
'a',b',c',d'
,四个视图如下:

 CREATE VIEW table_a AS 
   SELECT key, foo, others_field1, other_field2, ...
     FROM table_abcd
     WHERE source_data = 'a'
   WITH CHECK OPTION;
这样做你可以做类似的事情。主要问题是table_L tables的外键,如果有外键,可以对相关的表执行相同的操作

看看

将数据触发到另一个表 如果表位于不同的域中,并且此查询非常重要,则可以在另一个表中触发该数据。例如,
key
是添加数据的人的用户名(你想为此向他付费),而表是非常不同的东西


您可以向每个表添加触发器,以触发使用所需字段(包括
源表
字段)更新其他表回收的数据,然后使用简单的
分组查询

我认为,如果使用
key
来连接这些表,那是因为
key
在同一个域中(至少在概念上是这样)

如果您拥有或可能拥有一个包含
PK
中所有
key
值的表,您可以做得更好

部分解 仅当
是表的主键时

SELECT key, total_a, total_b, total_c, total_d
   FROM key_table, 
        lateral (
          SELECT count(key) as total_a
          FROM table_a
          WHERE key = key_table.key AND data = 'foo'
        ) a,
        lateral (
          SELECT count(key) as total_b
          FROM table_b
          WHERE key = key_table.key AND data = 'foo'
        ) b,
        lateral (
          SELECT count(key) as total_c
          FROM table_c
          WHERE key = key_table.key AND data = 'foo'
        ) c,
        lateral (
          SELECT count(key) as total_d
          FROM table_d
          WHERE key = key_table.key AND data = 'foo'
        ) d
    WHERE total_a IS NOT NULL OR total_b IS NOT NULL OR  total_c IS NOT NULL OR  total_d IS NOT NULL
    ORDER BY key
变模型解 另一种解决方案是更改在同一个表中包含表数据的数据模型。对于现有查询,可以使用视图。如果表在同一个域(例如不同国家的城市)中,且列相同(或差异最小),则这是一个很好的解决方案

新表必须有一个新字段
源数据
,其值为
'a',b',c',d'
,四个视图如下:

 CREATE VIEW table_a AS 
   SELECT key, foo, others_field1, other_field2, ...
     FROM table_abcd
     WHERE source_data = 'a'
   WITH CHECK OPTION;
这样做你可以做类似的事情。主要问题是table_L tables的外键,如果有外键,可以对相关的表执行相同的操作

看看

将数据触发到另一个表 如果表位于不同的域中,并且此查询非常重要,则可以在另一个表中触发该数据。例如,
key
是添加数据的人的用户名(你想为此向他付费),而表是非常不同的东西


您可以向每个表添加触发器,以触发使用所需字段(包括
源表
字段)更新其他表
回收的数据,然后使用简单的
分组查询

我想不出一种更简洁的方式来建议,如果所有数据都是表,那么查询可以简化。我想不出一种更简洁的方式来建议,如果所有数据都是表,那么查询可以简化。