FROM子句中的Postgres子查询

时间:2019-03-22 22:21:39

标签: postgresql subquery

在Postgres中,我在FROM子句中使用子查询,但实际上并不知道如何获取所需的结果。假设我有2个表,tableNameRegister(idNum integer, tableName text)mytable(comment text, orderVal integer)tableNameRegister看起来像这样:

 idnum | tablename
-------+------------
     1 | mytable
     2 | othertable

mytable看起来像这样:

  comment  | orderval
-----------+-------
 comment 1 |     1
 comment 2 |     2

我要从tableNametableNameRegister值,然后从该tableName值中进行选择,但所有操作都在一个查询中。本质上是这样的:

tabName = 'SELECT tableName FROM tableNameRegister WHERE idNum = 1;'
'SELECT * FROM ${tabName} WHERE orderVal = 2'

理想情况下,这将返回包含comment 2的行。所以我尝试在子查询中做到这一点:

'SELECT * FROM (SELECT tableName FROM tableNameRegister WHERE idNum = 1) AS tabname WHERE orderVal = 2;'

但是发现了,但是这并没有达到我的预期。本质上,它基于子查询的结果而不是我想要的mytable的实际值返回一种子表。我想知道是否有一种方法可以在一个查询/使用子查询中全部实现我的预期?还是我必须以编程方式将其分成两个查询?

1 个答案:

答案 0 :(得分:1)

此类事情最好通过某种脚本编写或以编程方式完成。使用plpgsql之类的东西,我们具有更大的灵活性,但是即使这样,棘手的事情是,如果所有表都不共享相同的结构或至少不共享公用的列名。如果确实这样做了,或者可以通过某种方式将它们抽象化,则可以使用以下内容:

CREATE OR REPLACE FUNCTION tablequery(id_num int)
RETURNS TABLE (comment varchar, orderval int)
AS $$
DECLARE
tableName varchar(50);
BEGIN
SELECT table_name FROM tableNameRegister WHERE idnum = id_num LIMIT 1 into tableName;
  RETURN QUERY EXECUTE format('SELECT * FROM %I WHERE orderVal = 2;', tableName);
END;
$$ LANGUAGE plpgsql;

select * FROM tableQuery(1);