我的桌子设计如下。
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:根据回答,它似乎不能干净地完成。我将尝试创建一个额外的列并使用触发器。
答案 0 :(得分:0)
我认为您不能在FROM子句中引用动态命名的表:
FROM concat('table', rows.fk_slave_id)
您是否尝试过从存储过程/函数构建/执行该SQL。您可以创建要作为字符串执行的SQL,然后只执行它。
看看这一个:
PostgreSQL - Writing dynamic sql in stored procedure that returns a result set