【问题标题】:Dynamic table name in PostgreSQLPostgreSQL 中的动态表名
【发布时间】:2013-01-10 00:57:56
【问题描述】:

我的情况是,多个表包含基于国家/地区的相似信息。更改数据库模式不是一种选择,我对使用存储过程不感兴趣。我更愿意在一个返回多行的单个查询中获取所有内容,而不是为每个国家/地区执行一个查询。

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

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.prefix]_products 的表。所有 *_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 |
+------------+--------------+=======+

目标是使查询格式类似于以下内容(显然这不起作用,否则我不会问这个问题...):

SELECT
  countries.prefix,
  products.title
FROM
  relationships
INNER JOIN
  [countries.prefix]_products AS products
  ON
  relationships.upc = products.upc
WHERE
  relationships.upc = '111111111111'

应该返回:

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

感谢您的帮助!如果这样做的唯一方法是通过存储过程,那么我想我没有任何其他选择,在这种情况下,您是否介意将一个示例过程和查询放在一起,以在上述表结构上执行?

【问题讨论】:

  • 尽管您说过,更改数据库不是一种选择,但修复您的设计是处理此问题的唯一 明智方法。您只需要一个带有 country_id 列的表 products
  • 你至少可以创建一个视图吗?
  • 所有表都连接在一起的视图?没想到其实……

标签: postgresql postgresql-9.2


【解决方案1】:

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

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'

但同样:请修复您的数据模型。这会越来越伤害你

【讨论】:

  • 虽然我更喜欢基于国家表导入数据的完全动态的方式,但这是一个非常优雅的解决方案,并且是迄今为止我从我所做的研究中看到的最好的解决方案。非常感谢!
  • @JoshuaBurns:如果你不打算修复那个设计,你会遇到更多这样的问题......
  • 我知道,不幸的是这不是我的设计,我只需要与它交互.. :'(
  • 如果您需要“前缀”表,最好有一个 products 表并创建返回旧的非规范化数据的视图。
  • 很公平,我会调查一下 :D 感谢您的提示,非常感谢。
猜你喜欢
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2017-01-19
相关资源
最近更新 更多