Динамическое имя таблицы в PostgreSQL

У меня есть ситуация, когда несколько таблиц содержат аналогичную информацию, основанную на стране. Изменение схемы базы данных не является вариантом, я не заинтересован в использовании хранимой процедуры. Я бы предпочел захватить все в одном запросе, возвращающем несколько строк, чем выполнение одного запроса для каждой страны.

Во-первых, у меня есть таблица определений, в которой перечислены все страны, в которых мы имеем таблицы:

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. |
+--------+-------+

Спасибо за помощь! Если ЕДИНСТВЕННЫЙ способ сделать это через хранимую процедуру, то я предположил, что у меня нет другой опции, и в этом случае вы не могли бы собрать пример процедуры и запроса, которые будут выполняться над вышеупомянутыми структурами таблиц?

0
nl ja de
Несмотря на то, что вы сказали, изменение базы данных не является вариантом, исправление вашего дизайна - это only разумный способ справиться с этим. Вам нужна только одна таблица products с столбцом country_id.
добавлено автор a_horse_with_no_name, источник
Можете ли вы хотя бы создать представление, возможно?
добавлено автор a_horse_with_no_name, источник
Вид, где все таблицы объединены вместе? Не думал об этом на самом деле ...
добавлено автор Joshua Burns, источник

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'

Но опять же: исправьте свой datamodel. Это еще больше повредит вам

3
добавлено
@JoshuaBurns: вы столкнетесь с такими проблемами, как если бы вы не исправили этот проект ...
добавлено автор a_horse_with_no_name, источник
Если вам нужны таблицы с префиксом, было бы лучше иметь одну таблицу products и создавать представления, которые возвращают старые ненормированные данные.
добавлено автор a_horse_with_no_name, источник
Хотя я предпочитаю полностью динамичный способ импорта данных на основе таблицы стран, это довольно приемлемое решение и, безусловно, лучшее решение, которое я видел из исследований, которые я сделал. Большое спасибо!
добавлено автор Joshua Burns, источник
я знаю, к сожалению, это не мой дизайн, мне просто нужно взаимодействовать с ним ..: '(
добавлено автор Joshua Burns, источник
справедливо, я буду смотреть на это: D спасибо за советы человек, серьезно оцененный.
добавлено автор Joshua Burns, источник
pgsql – PostgreSQL
pgsql – PostgreSQL
2 429 участник(ов)

Чат про PostgreSQL

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.