sql >> Database teknologi >  >> RDS >> PostgreSQL

ALLE operatører i WHERE-klausulen i Rails

Det er et tilfælde af .

Faktiske tabeldefinitioner (standard 1:n-relation, skjult af Ruby ORM) vil være noget som dette:

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

Dit forsøg på en forespørgsel forsøger effektivt at teste hver enkelt række i fees mod flere værdier i den givne matrix, som altid mislykkes, mens elementer i arrayet ikke er identiske. En værdi kan ikke være det samme som multiple andre værdier. Du har brug for en anden tilgang:

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

Dette forudsætter distinkt værdier i dit array og unikke poster i dine bordgebyrer som håndhævet af UNIQUE begrænsning jeg tilføjede ovenfor. Ellers er tællinger ikke pålidelige, og du skal bruge en mere sofistikeret forespørgsel. Her er et arsenal af muligheder:

Som du kan se, involverede jeg ikke tabellen instructor_student overhovedet. Mens referentiel integritet håndhæves med en FK-begrænsning (som det typisk er), kan vi arbejde med fees alene for at bestemme kvalificerende instructor_student_id . Hvis du har brug for at hente flere attributter fra hovedtabellen, skal du gøre det i et andet trin, f.eks.:

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


  1. Entity Framework Oracle tidsstempel

  2. Få alle POST-data og send e-mail

  3. Database design

  4. Lagret procedure i Oracle Eksempel med IN OUT parameter