sql >> データベース >  >> RDS >> PostgreSQL

ANDおよびORを使用したクエリで複数の行を取得する

    これは関係分割の場合です:

    SELECT c.id, c.name
    FROM   components_componentproperty cp1
    JOIN   components_componentproperty cp2 USING (component_id)
    JOIN   components_component         c   ON c.id = cp1.component_id
    WHERE  cp1.property_id = 9102  AND cp1.value IN ('4015', '4016')
    AND    cp2.property_id = 8801  AND cp2.value = '3'
    AND    c.type_id = 3832
    GROUP  BY c.id;
    

    ここに関連するテクニックの武器を集めました:

    多数のプロパティを確認する

    上記のクエリを拡張すると、プロパティがいっぱいの手にとって、それは可能な限り最速のソリューションの1つになります。数が多いほど、このルートを使用する方が便利です(また、高速になり始めます)。

    5つのプロパティの例、必要に応じて展開:

    SELECT c.id, c.name
    FROM  (
       SELECT id
       FROM  (
          SELECT component_id AS id, property_id  -- alias id just to shorten syntax
          FROM   components_componentproperty
          WHERE  property_id IN (9102, 8801, 1234, 5678, 9876)  -- expand as needed
          GROUP  BY 1,2
          ) cp1
       GROUP  BY 1
       HAVING count(*) = 5  -- match IN expression
       ) cp2
    JOIN   components_component c USING (id);
    

    内部サブクエリcp1の追加ステップ (component_id, property_id)ごとに明らかに複数のエントリがあるため、必要なのは components_componentproperty内 。 できた cp1を折りたたむ およびcp2 1つにまとめて確認

    HAVING count(DISTINCT property_id) = 5
    

    しかし、count(DISTINCT col)なので、もっと高くつくと思います。 行ごとに1回の並べ替え操作が必要です 。

    非常に長いリストの場合IN 悪い選択です。検討してください:




    1. Microsoft Accessチームからの更新(2017年6月)

    2. MySQL-SQLiteこの非常に単純なクエリを改善する方法は?

    3. Postgresql設定ファイルはどこにありますか:Windowsの「postgresql.conf」?

    4. クエリを最小化する方法は?