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
是添加数据的人的用户名(你想为此向他付费),而表是非常不同的东西
您可以向每个表添加触发器,以触发使用所需字段(包括源表
字段)更新其他表
回收的数据,然后使用简单的分组查询 我想不出一种更简洁的方式来建议,如果所有数据都是表,那么查询可以简化。我想不出一种更简洁的方式来建议,如果所有数据都是表,那么查询可以简化。