【问题标题】:Using results from PostgreSQL query in FROM clause of another query在另一个查询的 FROM 子句中使用 PostgreSQL 查询的结果
【发布时间】:2018-01-10 17:29:17
【问题描述】:

我有一张设计如下的桌子。

master_table
id -> serial
timestamp -> timestamp without time zone
fk_slave_id -> integer
fk_id -> id of the table
fk_table1_id -> foreign key relationship with table1
...
fk_table30_id -> foreign key relationship with table30

每次添加新表时,此表都会更改以包含要链接的新列。有人告诉我,它的设计目的是允许表中的删除在主节点中级联。

我遇到的问题是找到将主表链接到其他表的适当解决方案。我可以使用循环等以编程方式执行此操作,但这将非常低效。

这是用于获取表 id 和该表中行的 id 的查询。

SELECT fk_slave_id, concat(fk_table1_id,...,fk_table30_id) AS id
FROM master_table
ORDER BY id DESC
LIMIT 100;

结果是。

 fk_slave_id | id  
-------------+-----
          30 | 678
          25 | 677
          29 | 676
           1 | 675
          15 | 674
           9 | 673

下一步是使用这些数据来制定获取所需数据所需的表格。例如,需要 id 为 678 的 table30 中的数据。

这就是我卡住的地方。如果我使用 WITH 它似乎不接受 FROM 子句中的输出。

WITH items AS (
    SELECT fk_slave_id, concat(fk_table1_id,...,fk_table30_id) AS id
    FROM master_table
    ORDER BY id DESC
    LIMIT 100
    )
SELECT data
FROM concat('table', items.fk_slave_id)
WHERE id = items.id;

这会产生以下错误。

ERROR:  missing FROM-clause entry for table "items"
LINE x: FROM string_agg('table', items.fk_slave_id)

plpgsql 是使用 EXECUTE 格式的一个选项,但是我必须遍历每个结果并使用 EXECUTE 处理它。

在使用 SQL 之后有什么方法可以实现我的目标,还是需要以编程方式完成?

抱歉标题不好。我想不出另一种说法来表达这个问题。

编辑 1:用项目替换行

编辑 2:根据响应,这似乎不能干净地完成。我将求助于创建一个额外的列并使用触发器。

【问题讨论】:

  • "rows" 是保留字。 (看看语法突出显示!)尽量避免保留字作为标识符,即使它们看起来起作用。
  • @wildplasser 好点。我已经编辑了帖子(和我的脚本)以删除对行的引用。
  • 另外:你肯定需要动态 SQL。如果表名和/或列名称基于变量,则无法创建查询计划。您必须首先创建动态查询,并将结果提供给解析器/计划器/引擎。

标签: postgresql


【解决方案1】:

我认为您不能在 FROM 子句中引用动态命名的表:

FROM concat('table', rows.fk_slave_id)

您是否尝试过从存储过程/函数构建/执行该 SQL。您可以创建要作为字符串执行的 SQL,然后执行它。

看看这个:
PostgreSQL - Writing dynamic sql in stored procedure that returns a result set

【讨论】:

  • 我看到EXECUTE 是一个选项,但我不确定如何在多个查询中使用它。链接到的主题正在返回一个结果集,而不是使用多个查询。使用EXECUTE,您可以使用USING 插入您的值。我的值是多行,所以即使我在使用EXECUTE 之前抓取它们,我仍然需要依赖循环。这是我现在看不到的。如果可以以类似于我的WITH 查询的方式使用EXECUTE
  • 您可以使用游标来生成/执行多个查询...让我看看能否为您提供示例。
  • 对不起,朋友...除了在函数中定义多个光标之外,我没有看到一个干净的方法...也许有可能,但我现在放弃了:) 这里是我发现有用的地方:stackoverflow.com/questions/756689/…blog.dsl-platform.com/…sqlines.com/postgresql/how-to/…祝你好运。
  • 感谢您抽出宝贵时间来验证不可能很好地做到这一点。我也这么认为,但由于我远非 SQL 专家,所以我想确保我没有遗漏任何东西。我将编辑主帖,但我将通过添加另一列并在插入时使用触发器来执行我需要的操作来解决此问题。
  • 当然:) .
猜你喜欢
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多