2016-07-14 15 views
0

私は完全に一意の情報を保持する複数のテーブルをpostgresデータベースに持っています。この情報は、クエリで正しく結合されると、私が探しているすべての可能な組み合わせをすべて生成します。私が探している情報は完全なSKUです。 0.82秒のクエリ時間で、私は(インデックス適用なし)32640件のレコードを生成集計テーブルの行数

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 

このクエリを考えると 機能クエリ:

完全なSKUを生成するには、このクエリは、所望の結果を生成します。このような何か...

与えられた出力にのみしかし、私はそこに半分の方法を取得している

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秒の最終結果が得られます。私はインデックスを研究し、それらにどのテーブルを適用するのか、そしてどのようにクエリに影響を与えるのかを見ていきます。パフォーマンス時間を増やすことを考えていますか? –