如何在postgres中加入带有动态标识符的表?

Posted

技术标签:

【中文标题】如何在postgres中加入带有动态标识符的表?【英文标题】:How to join table with dynamic identifier in postgres? 【发布时间】:2014-02-07 04:11:11 【问题描述】:

我有一个表名table,其中包含两列foreign_table_nameforeign_key

是否可以编写一个SELECT 查询,该查询将JOIN 该表的值以及在列foreign_table_name 中指定名称的表?

例如,如果我们知道所有可能的目标外部表都有一个 name 字段,我想知道我是否可以写一些东西:

SELECT table.foo, table.bar, foreign_table.name 
FROM table
  JOIN $foreign_table AS foreign_table 
       ON (foreign_table.id = table.foreign_key
           $foreign_table = table.foreign_table);

当然可以接受任何使用 PlpgSQL 的解决方案。

这是一个简单的内容:

Table ``table``
------------------------------------------------
| foo | bar | foreign_table_name | foreign_key |
------------------------------------------------
|  A  |  1  | fruits             | 8           |
|  B  |  2  | vegetable          | 5           |
------------------------------------------------

Table ``fruit``
---------------
| id  | name  |
---------------
| 8   | apple |
---------------

Table ``vegetable``
----------------
| id  | name   |
----------------
| 5   | carrot |
----------------

预期的结果表是:

----------------------
| foo | bar | name   |
----------------------
|  A  |  1  | apple  |
|  B  |  2  | carrot |
----------------------

编辑:为了更清楚,我添加了完整的表格示例。

【问题讨论】:

您需要使用动态 SQL/准备好的语句来执行此操作。在基本 SQL 查询中,您必须有一个显式表。 查看 PL/PgSQL 中的EXECUTE 命令。或者从您的客户端生成查询。 @CraigRinger 我已经看过EXECUTE 声明,但即使这样我也没有设法得到解决方案。因此,如果您有任何想法,请分享。 【参考方案1】:

在客户端做这种事情通常更容易,但如果你想用 PL/PgSQL 也可以,例如

CREATE OR REPLACE FUNCTION dynamic_call(tblname text)
RETURNS TABLE (foo int, bar text, fname text)
AS $$
BEGIN
  RETURN QUERY EXECUTE format('
    SELECT t.foo, table.bar, f."name"
    FROM mytable t
    JOIN %I AS f ON (f.id = t.foreign_key);', tblname);
END;
$$ LANGUAGE plpgsql;

有关详细信息,请参阅 PL/PgSQL 文档。

【讨论】:

我在陈述我的问题时可能不够清楚。所以我编辑添加了一个实际的例子。您的回答对我没有帮助,因为:1 - 它是一个函数,我要了一个表,2- 表名必须来自基表列 foreign_table_name。但是,我在阅读您的提议时学到了一些 plpgsql,尤其是我缺少的 RETURNS TABLE。有了这个,我可能会设法找到解决方案。谢谢。 @vaab 如果没有动态 SQL,您将无法执行此操作,因此必须使用 PL/PgSQL 函数或客户端生成的 SQL。

以上是关于如何在postgres中加入带有动态标识符的表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中加入包含祖父-父-子列的表?

如何在 MySQL 中加入 2 个以上的表?

如何在 MySQL/MariaDB 中加入两个巨大的表?

如何使用内部/外部组合在 Access 中加入 4 个以上的表?

如何在 pyspark 中加入带有熊猫数据框的配置单元表?

Postgres UPSERT 语法混乱