如何将PostgreSQL行扩展为多行以进行更新;自定义字段";?
我有一个第三方软件使用的表(比如用户字段),每行有一个用户id、字段id和字段值。糟透了,我知道 我还拥有自己的另一个用户表users,其中包含填充此表所需的值,但字段_id除外,它是“magic”并对应于自定义字段映射 我如何编写一个select查询来实现这一点:如何将PostgreSQL行扩展为多行以进行更新;自定义字段";?,sql,postgresql,Sql,Postgresql,我有一个第三方软件使用的表(比如用户字段),每行有一个用户id、字段id和字段值。糟透了,我知道 我还拥有自己的另一个用户表users,其中包含填充此表所需的值,但字段_id除外,它是“magic”并对应于自定义字段映射 我如何编写一个select查询来实现这一点: user_id | company_name | first_name | country --------------------------------------------------- 1 | Nu
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,并打算将查询馈送到insert
我尝试过使用unnest和数组将字段展开成行,但它在处理select中的任何其他字段后会取消检测,因此只会复制未列出行的值
有什么想法吗
干杯,
硅
编辑:格式化并澄清不可靠的名称-值表是第三方。我的第一个想法是摆脱名称-值对体系结构。在关系数据库中,您只是在不断地寻找麻烦,正如您已经开始看到的那样 现在,把必要的责骂放在一边
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
我相信您可以想象,当您添加更多字段时,这种扩展是多么可怕。我的第一个想法是摆脱名称-值对体系结构。在关系数据库中,您只是在不断地寻找麻烦,正如您已经开始看到的那样 现在,把必要的责骂放在一边
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
我相信你可以想象,当你添加更多的字段时,这个问题会变得多么可怕。我将此作为一个单独的答案添加,因为它与我发布的其他问题有很大的不同。您可以尝试以下方法:
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表(或任何可能命名的表),它提供了所有可能的用户字段。不过,您必须使您的案例陈述保持最新。我将此作为一个单独的答案添加,因为它与我发布的另一个非常不同。您可以尝试以下方法:
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表(或任何可能命名的表),它提供了所有可能的用户字段。不过,您必须使您的案例陈述保持最新。请缩进代码示例以增加可读性。请缩进代码示例以增加可读性。我确实可以想象。不幸的是,我无法控制名称-值对。我可能会尝试使用“with”查询,因为我需要一些可能会很昂贵的底层连接。你认为有没有一种简单的方法将10、11、12作为重复值加入到不需要的值中?我确实可以想象。不幸的是,我无法控制名称-值对。我可能会尝试使用“with”查询,因为我需要一些可能会很昂贵的底层连接。你认为有没有一种简单的方法可以将10、11、12作为重复值加入到不需要的值中?