我有一个第三方软件(比如user_fields)使用的表,每行有一个user_id,一个field_id和一个field_value。我知道蹩脚。
我还有另一个我自己的用户用户表,其中包含填充此用户所需的值,除了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,并打算将查询输入到插入。
我通过使用unexst和一个数组进行了一次尝试,将字段扩展为行,但是在处理select中的任何其他字段后它就不需要了,所以只复制unnested行的值。
有什么想法吗?
干杯, 硅
编辑:格式化和澄清狡猾的名称 - 值表是第三方。
答案 0 :(得分:1)
我将此作为单独的答案添加,因为它与我发布的其他答案完全不同。你可以尝试这样的事情:
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陈述是最新的。
答案 1 :(得分:0)
我的第一个想法是摆脱名称 - 值对架构。在关系数据库中,你只是在寻找永无止境的麻烦,因为你已经开始看到了。
现在有了所需的责骂......
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
我相信你可以想象,当你添加更多的字段时,它会有多么可怕。