sql - SQLite 将特定的行列转换为附加列,并对这些列中的每一列进行内部连接
问题描述
对不起,奇怪的标题,但我不知道如何更好地表达它。
我有桌子Attributes
:
id|Name
-------
1 |att1
2 |att2
3 |...
表Product
:
id|Name
-------
1 |Pro1
2 |Pro2
3 |Pro4
和表ProductAttribute
:
id|productId|attributeId|value
------------------------------
1 |1 |1 |val11
2 |2 |1 |val21
3 |2 |2 |val22
4 |...
我想从我的查询中得到以下结果,基本上我想获取所有产品和所有属性,并为每个产品行将每个属性显示为一列。
我知道我可以用 a 来“做到” join
,但是有很多属性,手动做类似的事情是不可行的,所以我想动态地做,但是用 SQL 语言而不是一些外部语言。
以下是结果视图/查询的示例:
id|Product name|att1 |att2 |...
-------------------------------
1 |Pro1 |val11|Null |...
2 |Pro2 |val21|val22|...
3 |...
解决方案
您只是在寻找一个数据透视查询:
SELECT
p.Name,
MAX(CASE WHEN a.Name = 'att1' THEN pa.value END) AS att1,
MAX(CASE WHEN a.Name = 'att2' THEN pa.value END) AS att2
FROM Product p
LEFT JOIN ProductAttribute pa
ON p.id = pa.productId
LEFT JOIN Attributes a
ON pa.attributeId = a.id
GROUP BY
p.id, p.Name;
推荐阅读
- kubernetes-dashboard - 如何使自动定时注销时间更长?
- python - `fit_generator` 尚未为未构建的模型子类启用
- javascript - 如果 jstree.core.data 的数据为空,则显示错误消息
- javascript - jest.spyOn 不适用于导入的函数。预期的模拟函数已被调用,但未调用
- ruby-on-rails - 如何在 Rails 中渲染 SVG 内联?
- .net-core - 制作 Azure Function signalR 有效负载骆驼案例
- django - 使用 django-allauth 在 SignupForm 中添加更多字段
- google-maps - Map Center 和 Marker 基于文本输入创建
- firebase - 是否可以在 Cloud Firestore 中使用模板字符串变量编写规则?
- docker - 由于权限问题,Fluentd 无法访问 /var/lib/docker/containers 下的日志