PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

ALL opérateur dans la clause WHERE dans Rails

C'est un cas de .

Les définitions de table réelles (relation standard 1:n, masquée par l'ORM Ruby) ressembleront à ceci :

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)
);

Votre tentative de requête essaie effectivement de tester chaque ligne dans fees contre plusieurs valeurs dans le tableau donné, qui toujours échoue tant que les éléments du tableau ne sont pas identiques. Un la valeur ne peut pas être identique à multiple d'autres valeurs. Vous avez besoin d'une approche différente :

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[]);

Cela suppose distinct valeurs dans votre tableau et entrées uniques dans vos frais de table comme imposé par le UNIQUE contrainte que j'ai ajoutée plus haut. Sinon, les décomptes ne sont pas fiables et vous devez utiliser une requête plus sophistiquée. Voici un arsenal d'options :

Comme vous pouvez le voir, je n'ai pas impliqué la table instructor_student du tout. Alors que l'intégrité référentielle est appliquée avec une contrainte FK (comme c'est généralement le cas), nous pouvons travailler avec des fees seul pour déterminer instructor_student_id éligible . Si vous avez besoin de récupérer plus d'attributs de la table principale, faites-le dans une 2ème étape, comme :

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