Как расширить строку PostgreSQL на несколько строк для обновления «пользовательских полей»? - PullRequest
1 голос
/ 01 декабря 2009

У меня есть таблица, используемая одним программным обеспечением сторонних производителей (скажем, user_fields), в котором для каждой строки есть user_id, field_id и field_value. Дерьмо я знаю.

У меня также есть другая собственная таблица пользователей, users, которая содержит значения, необходимые для ее заполнения, за исключением field_id, который является «волшебным» и соответствует сопоставлению настраиваемого поля.

Как мне написать запрос на выборку, который превратит это:

user_id | company_name       | first_name | country
---------------------------------------------------
1       | Nutty Choc Company | Si         | GB
2       | Ljubljanske R Us   | Pie        | IT

В это?

user_id | field_value        | field_id
---------------------------------------
1       | Nutty Choc Company | 10
1       | Si                 | 11
1       | GB                 | 12
2       | Ljubljanske R Us   | 10
2       | Pie                | 11
2       | IT                 | 12

Я использую Postgresql 8.4 и намереваюсь вставить запрос для вставки.

У меня был удар с помощью unnest и массива, чтобы развернуть поля в строки, но он отменяется после обработки любого другого поля в select, и поэтому просто дублирует значение для неотнесенных строк.

Есть идеи?

Ура, Si

РЕДАКТИРОВАТЬ: форматирование и уточнение, что изворотливая таблица значений имен является третьей стороной.

Ответы [ 2 ]

1 голос
/ 01 декабря 2009

Я добавляю это как отдельный ответ, так как он сильно отличается от того, который я написал. Вы можете попробовать что-то вроде этого:

SELECT
     U.id,
     UF.id AS field_id,
     CASE UF.id
          WHEN 10 THEN U.first_name
          WHEN 11 THEN U.country
          WHEN 12 THEN U.company_name
          ELSE NULL
     END AS field_value
FROM
     Users U
CROSS JOIN User_Fields UF

Это предполагает, что у вас есть таблица User_Fields (или как она может быть названа), которая дает вам все возможные пользовательские поля. Вы должны будете постоянно обновлять выписку по CASE.

0 голосов
/ 01 декабря 2009

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

Теперь с необходимыми выговорами в сторону ...

INSERT INTO My_Horrible_Name_Value_Pair_Table
(
     user_id,
     field_id,
     field_value
)
SELECT
     id,
     10,
     first_name
FROM
     Users
UNION ALL
SELECT
     id,
     11,
     country
FROM
     Users
UNION ALL
SELECT
     id,
     12,
     company_name
FROM
     Users

Я уверен, что вы можете представить, насколько ужасно это масштабируется, если вы добавите больше полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...