首页 > 解决方案 > 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 |...

标签: sqlsqlitedynamicrowmultiple-columns

解决方案


您只是在寻找一个数据透视查询:

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;

推荐阅读