【问题标题】:PostgreSQL dynamic table accessPostgreSQL 动态表访问
【发布时间】:2011-08-11 23:26:13
【问题描述】:

我有一个 products 架构和一些表。
products 模式中的每个表都有一个id,通过这个id 我可以得到这个表名,例如

products
    \ product1
    \ product2
    \ product3

我需要从对适当产品的动态访问中选择信息,例如

SELECT * FROM 'products.'(SELECT id from categories WHERE id = 7);

当然,这行不通...
我如何在 PostgreSQL 中做类似的事情?

【问题讨论】:

  • 这些不应该是单独的表格。将它们全部放在同一个表中,为 ID 添加一列,然后按该 ID 进行选择。
  • 我同意 tdammers 的观​​点。这是一个糟糕的数据库设计

标签: sql database postgresql plpgsql dynamic-sql


【解决方案1】:

在我看来,您似乎遇到了一个主要的架构设计问题:您不应该只有一个包含 category_id 的产品表吗?

您可能会维护本文中提到的网站吗?

http://thedailywtf.com/Articles/Confessions-The-Shopping-Cart.aspx

【讨论】:

    【解决方案2】:

    好的,我找到了解决办法:

    CREATE OR REPLACE FUNCTION getProductById(cid int) RETURNS RECORD AS $$
        DECLARE
        result RECORD;
    
        BEGIN
            EXECUTE 'SELECT * FROM ' || (SELECT ('products.' || (select category_name from category where category_id = cid) || '_view')::regclass) INTO result;
    
            RETURN result;
        END;
    $$ LANGUAGE plpgsql;
    

    然后选择:

    SELECT * FROM getProductById(7) AS b (category_id int, ... );
    

    适用于 PostgreSQL 9.x

    【讨论】:

    • 您好,Alex 我已经尝试过了,但是我在一列中得到了记录,并且得到了逗号分隔的值。我想要表格格式,所以请您帮帮我。提前致谢。
    【解决方案3】:

    如果您可以将数据库布局更改为使用partitioning,那么这可能是可行的方法。然后您可以像访问一个表而不是多个子表一样访问“主”表。

    您可以创建一个视图,将表与对应于其所在表的额外列组合在一起。如果您的所有查询都为这个额外的列指定了一个值,那么规划器应该足够聪明,可以跳过扫描所有其余的表。

    或者您可以在PL/pgSQL 中编写一个函数,使用EXECUTE 命令在获取表名后构造适当的查询。该函数甚至可以return a set,因此它可以在 FROM 子句中使用,就像您使用表引用一样。或者您可以在应用程序逻辑中执行相同的查询构造。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2010-10-26
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      相关资源
      最近更新 更多