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

RailsのWHERE句のALL演算子

    これは、 の場合です。 。

    実際のテーブル定義(標準の1:n関係、Ruby ORMによって非表示)は次のようになります:

    CREATE TABLE instructor_student (
       id serial PRIMARY KEY
       name ...
    );
    
    CREATE TABLE fees (
       id serial PRIMARY KEY
     , instructor_student_id integer NOT NULL REFERENCES instructor_student
     , course_type ...
     , monthly_detail date
     , UNIQUE (instructor_student_id, course_type, monthly_detail)
    );
    

    クエリを試行すると、feesの各行を効果的にテストしようとします。 指定された配列内の複数の値に対して、常に 配列の要素が同一でない間は失敗します。 1つ 値を複数と同じにすることはできません 他の値。別のアプローチが必要です:

    SELECT instructor_student_id
    FROM   fees
    WHERE  course_type = ?
    AND    monthly_detail = ANY(ARRAY[?]::date[])  -- ANY, not ALL!
    GROUP  BY instructor_student_id
    HAVING count(*) = cardinality(ARRAY[?]::date[]);
    

    これは、明確を前提としています UNIQUEによって強制されるような、配列内の値とテーブル内の一意のエントリ 上で追加した制約。それ以外の場合、カウントは信頼できず、より高度なクエリを使用する必要があります。オプションの武器は次のとおりです。

    ご覧のとおり、私はテーブルinstructor_studentを関与させませんでした まったく。参照整合性は(通常のように)FK制約で適用されますが、feesで作業できます。 適格なinstructor_student_idを決定するために単独で 。メインテーブルからさらに属性をフェッチする必要がある場合は、次のように2番目のステップで取得します。

    SELECT i.*  -- or whatever you need
    FROM   instructor_student i
    JOIN  (
       SELECT ...  -- query from above
       ) f ON f.instructor_student_id = i.id
    ;
    


    1. MySQL-平均行長のクエリ

    2. 参照Microsoft.SqlServer.Smo.dll

    3. SQLServerの列で数値以外の値を検索する

    4. MySQLコネクタ/C++でどの実行関数を使用する必要がありますか?