【发布时间】: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