sql >> Database >  >> RDS >> PostgreSQL

ALL-operator in WHERE-clausule in Rails

Dat is een geval van .

Werkelijke tabeldefinities (standaard 1:n-relatie, verborgen door de Ruby ORM) zullen ongeveer als volgt zijn:

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

Uw poging tot een zoekopdracht probeert effectief elke afzonderlijke rij te testen tegen fees tegen meerdere waarden in de gegeven array, die altijd mislukt terwijl elementen van de array niet identiek zijn. Eén waarde kan niet hetzelfde zijn als multiple andere waarden. Je hebt een andere aanpak nodig:

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

Dit veronderstelt verschillend waarden in uw array en unieke vermeldingen in uw tafelkosten, zoals afgedwongen door de UNIQUE beperking die ik hierboven heb toegevoegd. Anders zijn tellingen niet betrouwbaar en moet u een meer geavanceerde query gebruiken. Hier is een arsenaal aan opties:

Zoals je kunt zien, heb ik de tabel instructor_student niet gebruikt helemaal niet. Hoewel referentiële integriteit wordt afgedwongen met een FK-beperking (zoals gewoonlijk het geval is), kunnen we werken met fees alleen om de kwalificerende instructor_student_id te bepalen . Als je meer attributen uit de hoofdtabel moet halen, doe dat dan in een 2e stap, zoals:

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


  1. Hoe de ware grootte van de MySQL-database te krijgen?

  2. Een resultaatkolom hergebruiken in een uitdrukking voor een andere resultaatkolom

  3. Wat is Oracle Database?

  4. PHP en MySQL trekken seconden van tijd af