2016-07-14 95 views
0

我有一个postgres数据库中的多个表,它们拥有完全独特的信息。这些信息如果在查询中正确连接在一起,将会产生我期待的所有可能的组合。我正在寻找的信息是完整的SKU。汇总表中的行数

为了产生完整的SKU,这个查询产生所期望的结果: 功能查询

SELECT 
    materials.code, 
    "part_base_parts".code as part_base_parts_id, 
    shanks.code AS shank_id, 
    measurements.description 
FROM 
    "part_base_parts" 
LEFT JOIN "part_types" ON "part_base_parts"."part_type_id" = "part_types"."id" 
RIGHT JOIN "parts_to_shanks" ON "part_base_parts"."id" = "parts_to_shanks"."part_base_part_id" 
RIGHT JOIN "parts_to_measurements" ON "part_base_parts"."id" = "parts_to_measurements"."part_base_part_id" 
RIGHT JOIN "parts_to_materials" ON "part_base_parts"."id" = "parts_to_materials"."part_base_part_id" 
JOIN materials ON "parts_to_materials"."material_id" = materials."id" 
JOIN shanks ON "parts_to_shanks"."shank_id" = shanks."id" 
JOIN measurements ON "parts_to_measurements"."measurement_id" = measurements."id" 
ORDER BY 
    part_base_parts_id ASC, 
    materials.code ASC, 
    shank_id ASC, 
    measurements.description ASC 

鉴于此查询,我产生32640条记录(没有应用索引),用0.82秒查询时。事情是这样的......

给定输出

code part_base_parts_id shank_id description 
AA  5105    A   03.0 
. 
. 32,638 rows in here. 
. 
ST  6939    D   9/16 

这是唯一让我走了一半,虽然。我需要从查询中取回结果并从每列中生成总计数。所以,我需要有结果将是:

预期的效果

code: AA - ###0 
     ... 
     ST - ###0 
part_base_parts_id: 5105 - ###0 
        ... 
        6939 - ###0 
shank_id: A - ###0 
      ... 
      D - ###0 
description: 03.0 - ###0 
      ... 
      9/16 - ###0 

是否有生产“预期效果”从Postgres的的方法吗?

回答

2

如果你想要它们在行中,那么肯定。

WITH cte AS( 
    SELECT 
     materials.code, 
     "part_base_parts".code as part_base_parts_id, 
     shanks.code AS shank_id, 
     measurements.description 
    FROM 
     "part_base_parts" 
    LEFT JOIN "part_types" ON "part_base_parts"."part_type_id" = "part_types"."id" 
    RIGHT JOIN "parts_to_shanks" ON "part_base_parts"."id" = "parts_to_shanks"."part_base_part_id" 
    RIGHT JOIN "parts_to_measurements" ON "part_base_parts"."id" = "parts_to_measurements"."part_base_part_id" 
    RIGHT JOIN "parts_to_materials" ON "part_base_parts"."id" = "parts_to_materials"."part_base_part_id" 
    JOIN materials ON "parts_to_materials"."material_id" = materials."id" 
    JOIN shanks ON "parts_to_shanks"."shank_id" = shanks."id" 
    JOIN measurements ON "parts_to_measurements"."measurement_id" = measurements."id" 
    ORDER BY 
     part_base_parts_id ASC, 
     materials.code ASC, 
     shank_id ASC, 
     measurements.description ASC  
) 
SELECT key, value, count(*) 
FROM(
    SELECT 'code' AS key, code AS value 
    FROM cte 
    UNION ALL 
    SELECT 'part_base_parts_id', code 
    FROM cte 
    UNION ALL 
    SELECT 'shank_id', shank_id 
    FROM cte 
    UNION ALL 
    SELECT 'description', description 
    FROM cte 
) AS q 
GROUP BY key, value 
ORDER BY key, value 
+1

缺少一个'UNION ALL'。我会添加'ORDER BY key,value'。 – klin

+0

我修复了复制/粘贴错误,并按照@klin的建议添加了ORDER BY。 –

+0

该查询工作@ jakub-kania和@klin!我确实在查询时间上受到了打击。从.82秒到最后结果〜3.7秒。我将研究索引并查看要应用它们的表以及这可能如何影响查询。关于增加表演时间的想法? –