SQL:将具有相同ID的行拆分为列+左连接

时间:2016-03-04 05:13:13

标签: sql

我有一个cs购物车数据库,我试图选择所有产品的所有属性,问题是对于产品的每个单独属性,我的查询创建一个新行,我想要有一行对于将所有属性都列入列的每个产品。

这是我现在的询问:

SELECT a.product_id, b.variant, c.description, d.product_code
FROM cscart_product_features_values a
LEFT JOIN cscart_product_feature_variant_descriptions b ON a.variant_id =    b.variant_id
LEFT JOIN cscart_product_features_descriptions c ON a.feature_id = c.feature_id
LEFT JOIN cscart_products d ON a.product_id = d.product_id

运行查询后,我得到以下结果:

product_id;"variant";"description";"product_code"
38;"1st";"Grade Level";"750"
38;"Math";"Subject Area";"750"
38;"Evan-Moor";"Publisher";"750"
etc next product

我想要的是:

 product_id;"product_code";"Grade Level";"Subject Area";"Publisher"
 38;"750";"1st";"Math";"Evan-Moor"
 etc next product

我们只有3种类型的属性:成绩水平,学科领域和出版商。

任何想法如何改进我的查询并实现这一目标?即使将一个列中的所有3个属性连接起来,我也很高兴,用“,”分隔。

1 个答案:

答案 0 :(得分:1)

这是一个使用GROUP BY和MAX(case表达式)的通用SQL解决方案,可以将3行转换为包含3列的单行。

SELECT
        v.product_id
      , p.product_code
      , MAX(CASE WHEN fd.description = 'Grade Level'  THEN vd.variant END) AS GradeLevel
      , MAX(CASE WHEN fd.description = 'Subject Area' THEN vd.variant END) AS SubjectArea
      , MAX(CASE WHEN fd.description = 'Publisher'    THEN vd.variant END) AS Publisher
FROM cscart_products p
        LEFT JOIN cscart_product_features_values v ON p.product_id = v.product_id
        LEFT JOIN cscart_product_feature_variant_descriptions vd ON v.variant_id = vd.variant_id
        LEFT JOIN cscart_product_features_descriptions fd ON v.feature_id = fd.feature_id
GROUP BY
        v.product_id
      , p.product_code

这种方法应该适用于任何SQL数据库。

另请注意,我已更改了表的顺序,因为我认为cscart_products中必须有一行,但其他表中可能没有相关的行。

我也更改了别名,我个人并不关心基于查询中使用顺序的别名(例如我只是改变了顺序,所以我不得不更改所有引用)。我用过' p' =产品,' v' =变种,' vd' =变体描述& ' FD' =功能描述' - 对于别名的这种约定,我可以在不改变每个引用的情况下重新排列查询。