【问题标题】:PostgreSQL nested selectsPostgreSQL 嵌套选择
【发布时间】:2016-06-20 16:40:48
【问题描述】:

有没有人可以帮助我使用以下功能进行查询:

  1. 让我们有一个简单的语句:

    SELECT relname FROM pg_catalog.pg_class WHERE relkind = 'r';
    

    这将产生一个很好的结果,只有一列 - 所有表的名称。

  2. 现在让我们假设其中一张表的名称为“table1”。如果我们执行:

    SELECT count(*) FROM table1;
    

    我们会得到表“table1”的行数。

  3. 现在真正的问题 - 这两个查询如何统一并有一个查询,它给出两列的结果:表名和行数?用伪 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


【解决方案1】:

使用 PL/pgSQL(postgres SQL 过程语言),您可以通过构建一个字符串然后将其作为 SQL 执行来执行 dynamic queries。请注意,这是特定于 postgres 的,但其他数据库可能有类似的东西。更一般地说,如果您愿意超越 SQL,您可以使用任何编程语言(或 shell/cmd 脚本)来做到这一点。

顺便说一下,搜索“postgres 动态查询”会得到更好的结果,因为“嵌套选择”有不同的含义。

【讨论】:

  • 让我试试 - 我明白你的意思,但让我阅读文档并尝试一下。我会回复你的。
  • 第二次编辑结果
猜你喜欢
  • 2011-10-23
  • 2020-11-24
  • 1970-01-01
  • 2011-05-16
  • 2020-12-07
  • 2019-12-04
  • 1970-01-01
  • 2016-05-22
  • 2010-10-04
相关资源
最近更新 更多