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

Operatore ALL nella clausola WHERE in Rails

Questo è un caso di .

Le effettive definizioni della tabella (relazione 1:n standard, nascosta dall'ORM di Ruby) saranno qualcosa del genere:

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

Il tuo tentativo di eseguire una query tenta efficacemente di testare ogni singola riga in fees rispetto a più valori nella matrice data, che sempre fallisce mentre gli elementi dell'array non sono identici. Uno il valore non può essere uguale a multiplo altri valori. Hai bisogno di un approccio diverso:

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

Questo presuppone distinto valori nella tua matrice e voci univoche nella tua tabella tariffe come imposto da UNIQUE vincolo che ho aggiunto sopra. Altrimenti, i conteggi non sono affidabili e devi usare una query più sofisticata. Ecco un arsenale di opzioni:

Come puoi vedere, non ho coinvolto la tabella instructor_student affatto. Sebbene l'integrità referenziale sia applicata con un vincolo FK (come in genere), possiamo lavorare con fees da solo per determinare instructor_student_id qualificante . Se hai bisogno di recuperare più attributi dalla tabella principale, fallo in un secondo passaggio, come:

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