sql >> Databasteknik >  >> RDS >> PostgreSQL

ALL operatör i WHERE-klausul i Rails

Det är ett fall av .

Faktiska tabelldefinitioner (standard 1:n-relation, dolda av Ruby ORM) kommer att vara ungefär så här:

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

Ditt försök till en fråga försöker effektivt testa varje enskild rad i fees mot flera värden i den givna arrayen, som alltid misslyckas medan element i arrayen inte är identiska. En värde kan inte vara detsamma som flera andra värden. Du behöver ett annat tillvägagångssätt:

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

Detta förutsätter distinkt värden i din array och unika poster i dina bordsavgifter som tillämpas av UNIQUE begränsning jag lagt till ovan. Annars är räkningar inte tillförlitliga och du måste använda en mer sofistikerad fråga. Här är en arsenal av alternativ:

Som du kan se involverade jag inte tabellen instructor_student alls. Även om referensintegritet upprätthålls med en FK-begränsning (som det vanligtvis är), kan vi arbeta med fees ensam för att fastställa kvalificerande instructor_student_id . Om du behöver hämta fler attribut från huvudtabellen, gör det i ett andra steg, som:

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


  1. Vilken kolumntyp ska användas för att lagra serialiserade data i en mysql db?

  2. java - DataSource för fristående applikation - ingen applikationsserver

  3. Vilken MySQL-fråga är snabbare?

  4. Php-sida med html-formulär inuti exekvera php-kod innan formuläret fylls i