在另一个查询的FROM子句中使用PostgreSQL查询的结果

时间:2018-01-10 17:29:17

标签: postgresql

我的桌子设计如下。

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

下一步是使用此数据来制定获取所需数据所需的表。例如,table30需要数据,ID为678。

这就是我被困的地方。如果我使用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:根据回答,它似乎不能干净地完成。我将尝试创建一个额外的列并使用触发器。

1 个答案:

答案 0 :(得分:0)

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

FROM concat('table', rows.fk_slave_id)

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

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