sql - 将名称/值字段的大查询重复列列表拆分为单独的列
问题描述
使用大查询 sql - 制作重复字段列的条目的最佳方法是什么?该表有一个重复字段 user_attributes ,它是 30 条记录的列表,每条记录都有两个字段:name
和value
. 几乎总是有相同的 30 个名称 - 例如假设名称包括fieldA
和fieldB
。
在不更改行数的情况下,我想添加 30 列具有这些名称的列,并且数据是值。我有这个
tbl2 AS (SELECT * EXCEPT(user_attributes, name, value), user_attribute.value AS fieldA
FROM (tbl1 CROSS JOIN UNNEST(tbl1.user_attributes) AS user_attribute)
WHERE user_attribute.name = 'fieldA'),
它解压了其中一个条目 - 但在丢失的地方删除了几行(我宁愿在这些行中有一个 null )。我可以继续这样做,但是 30 个这样的交叉连接会在过滤器正常的情况下不嵌套,还是会变成昂贵的查询?
或者,这不是最佳做法吗?我想对不同的用户属性字段进行分组 - 统计信息、平均值等 - 这就是我想让表格更有条理的原因。
解决方案
您不应该使用 CROSS JOIN UNNEST,而是可以在 select 语句中解压缩值。通过这种方式,将不会消除具有 NULL 值的行。
例子:
SELECT * EXCEPT(user_attributes),
(SELECT value FROM UNNEST(user_attributes) WHERE name = 'fieldA') as fieldA,
(SELECT value FROM UNNEST(user_attributes) WHERE name = 'fieldB') as fieldB,
(SELECT value FROM UNNEST(user_attributes) WHERE name = 'fieldC') as fieldC
FROM tbl1
推荐阅读
- database - 如何在 Codeigniter 3 模型中获取类别、项目和子项目?
- batch-file - 如何一次将多个值传递到批处理文件
- python - 使用 xlrd 读取 excel 时出现数字格式问题
- django - 如何从 JSON 中的模板重写数据?
- angular - ui-router 中是否有等效于 transition.from() 的 @angular/router?
- c# - 如何在不访问应用程序目录的情况下将程序集从字节数组加载到非默认 AppDomain 中?
- batch-file - 替换可能因字符串上的特定名称而异的文件名
- java - 初始化嵌套实体的正确方法是什么?
- node.js - 如何使用 Node.js 和 Express 实现警报
- java - 如何检测文本中的非单词?