【发布时间】:2016-06-20 16:40:48
【问题描述】:
有没有人可以帮助我使用以下功能进行查询:
-
让我们有一个简单的语句:
SELECT relname FROM pg_catalog.pg_class WHERE relkind = 'r';这将产生一个很好的结果,只有一列 - 所有表的名称。
-
现在让我们假设其中一张表的名称为“table1”。如果我们执行:
SELECT count(*) FROM table1;我们会得到表“table1”的行数。
-
现在真正的问题 - 这两个查询如何统一并有一个查询,它给出两列的结果:表名和行数?用伪 SQL 写的应该是这样的:
SELECT relname, (SELECT count(*) FROM relname::[as table name]) FROM pg_catalog.pg_class WHERE relkind = 'r';
这里是一个例子-如果数据库中有3个表,名称分别为table1、table2和table 3,它们分别有20、30和40行,查询结果应该是这样的:
-------------
|relname| rows|
|-------------|
|table1 | 20|
|-------------|
|table2 | 30|
|-------------|
|table3 | 40|
-------------
感谢所有愿意提供帮助的人 ;-)
附:是的,我知道表名不是模式限定的 ;-) 我们希望数据库中的所有表都有唯一的名称 ;-)
(更正上次查询中重命名为 relname 的拼写错误)
EDIT1:问题与“我如何才能找到表中的行数”无关。我要问的是:如何使用 2 个选择构建一个查询,第二个选择将来自第一个选择结果的列的值作为 FROM。
EDIT2:正如@jdigital 建议的那样,我已经尝试过动态查询并且它完成了这项工作,但只能在 PL/pgSQL 中使用。所以不符合我的需求。此外,我尝试使用 PREPARE 和 EXECUTE 语句 - 又一次它不起作用。无论如何 - 我会坚持使用两种查询方法。但我很确定 PostgreSQL 能够做到这一点....
【问题讨论】:
-
你不能使用 PL/pgSQL 有什么原因吗?
-
我不是 PostgreSQL 方面的专家(我希望我是),但 AFAIK 不能在语句中使用 PL/pgSQL(当然可能有函数调用......等等)。但我实际上想要做的是执行一个查询 (SELECT) 并根据结果生成另一个查询并将结果合并为一个。你能做这个吗 ???它应该类似于
SELECT relname, [PL/pgSQL BLOCK:: EXECUTE 'SELECT count(*) FROM ' || relname ] FROM pg_catalog.pg_class WHERE relkind = 'r';。我什至不知道如何对其进行伪编码...... -
实现此目的的一种方法是使用联合在一起的 SELECT 语句。您的脚本(使用您喜欢的任何编程语言,PL/pgSQL 作为一种容易获得的选择)将遍历表,为目录中的每个表构建一个带有 SELECT 和 UNION 的字符串。完成后,您只需执行它。关键是您将 SQL 语句生成为字符串。您并没有使用任何神奇的 SQL 能力:您首先必须了解如何将这个问题分解为可以用普通 SQL 解决的问题(一旦出现,您就可以生成它)。
-
所以你要构建一个这样的字符串:
"SELECT 'table1', count(*) from table1 UNION SELECT 'table2', count(*) from table2 ..."
标签: postgresql select nested