PostgreSQL中的动态表名

PostgreSQL中的动态表名,postgresql,postgresql-9.2,Postgresql,Postgresql 9.2,我的情况是,多个表包含基于国家的类似信息。更改数据库模式不是一个选项,我对使用存储过程不感兴趣。我更喜欢在一个返回多行的查询中获取所有内容,而不是对每个国家执行一个查询 首先,我有一个定义表,其中列出了我们有表的所有国家: countries +============+========+ | country_id | prefix | +============+========+ | 1 | us | +------------+--------+ | 2

我的情况是,多个表包含基于国家的类似信息。更改数据库模式不是一个选项,我对使用存储过程不感兴趣。我更喜欢在一个返回多行的查询中获取所有内容,而不是对每个国家执行一个查询

首先,我有一个定义表,其中列出了我们有表的所有国家:

countries
+============+========+
| country_id | prefix |
+============+========+
| 1          | us     |
+------------+--------+
| 2          | ca     |
+------------+--------+
其次,我有一个关系表:

relationships
+========+============+==============+
| rel_id | country_id | upc          |
+========+============+==============+
| 1      | 1          | 111111111111 |
+--------+------------+--------------+
| 2      | 2          | 111111111111 |
+--------+------------+--------------+
| 3      | 1          | 222222222222 |
+--------+------------+--------------+
| 4      | 2          | 222222222222 |
+--------+------------+--------------+
| 5      | 2          | 333333333333 |
+--------+------------+--------------+
| 6      | 1          | 444444444444 |
+--------+------------+--------------+
然后,我有两个名为“us_products”和“ca_products”的表。如果countries表中存在条目,则存在名为[countries.prefix]\u products的表。所有*_产品表彼此相同。相同的列和数据类型

us_products
+============+==============+=======+
| product_id | upc          | title |
+============+==============+=======+
| 1          | 111111111111 | Shoe! |
+------------+--------------+=======+
| 2          | 222222222222 | Tie   |
+------------+--------------+=======+
| 3          | 444444444444 | Sock  |
+------------+--------------+=======+

ca_products
+============+==============+=======+
| product_id | upc          | title |
+============+==============+=======+
| 1          | 111111111111 | Shoe. |
+------------+--------------+=======+
| 2          | 222222222222 | Tie   |
+------------+--------------+=======+
| 3          | 333333333333 | Shirt |
+------------+--------------+=======+
目标是将查询格式化为类似于以下内容的格式(显然这不起作用,否则我不会问这个问题……):

应返回:

+========+=======+
| prefix | title |
+========+=======+
| us     | Shoe! |
+--------+-------+
| ca     | Shoe. |
+--------+-------+

谢谢你的帮助!如果实现这一点的唯一方法是通过存储过程,那么我想我没有任何其他选择,在这种情况下,您介意提供一个示例过程和查询,该过程和查询将在上述表结构上执行吗?

如果您不想创建视图,可以使用公共表表达式作为“临时”表达式视图:


但再次强调:一定要修复您的数据模型。这将对您造成越来越大的伤害

如果您不想创建视图,可以使用公共表表达式作为“临时”视图:


但再次强调:一定要修复您的数据模型。这将对您造成越来越大的伤害

尽管您说过,更改数据库不是一个选项,但修复您的设计是处理这一问题的唯一明智的方法。您只需要一个带有国家/地区id列的表
products
。您至少可以创建一个视图吗?一个将所有表连接在一起的视图?实际上我没有想到……尽管你说过,更改数据库不是一个选项,但修复你的设计是处理这个问题的唯一明智的方法。您只需要一个带有国家/地区id列的表
products
。您至少可以创建一个视图吗?一个将所有表连接在一起的视图?实际上我没有想到……虽然我更喜欢一种基于国家表的完全动态的数据导入方式,但这是一个非常好的eligant解决方案,也是我所做的研究中看到的最好的解决方案。多谢各位@约书亚·伯恩斯:如果你不打算修改这个设计,你会遇到更多这样的问题……我知道,不幸的是,这不是我的设计,我只需要与它交互(如果您需要“前缀”表,最好有一个
产品
表,并创建返回旧的非规范化数据的视图。公平地说,我将对此进行研究:D感谢tips man,非常感谢。虽然我更喜欢基于countries表导入数据的完全动态的方式,但这是一个非常方便的解决方案,而且是b从我所做的研究来看,这是我见过的最好的解决方案。非常感谢!@JoshuaBurns:如果你不打算修复该设计,你会遇到更多类似的问题……我知道,不幸的是,这不是我的设计,我只需与之交互……。(如果你需要“前缀”表,最好有一个
产品
表,并创建返回旧的非规范化数据的视图。足够公平的话,我将对此进行研究:D感谢tips man,非常感谢。
+========+=======+
| prefix | title |
+========+=======+
| us     | Shoe! |
+--------+-------+
| ca     | Shoe. |
+--------+-------+
with normalized_products as (
   select 1 as country_id, 
          product_id, 
          upc,
          title 
   from us_products
   union all
   select 2 as country_id, 
          product_id, 
          upc,
          title 
   from ca_products
) 
SELECT countries.prefix,
       products.title
FROM relationships as rel
  JOIN normalized_products as prod
    ON rel.upc = prod.upc
   and rel.country_id = prod.country_id
where rel.upc = '111111111111'