sql >> Databáze >  >> RDS >> PostgreSQL

Operátor ALL v klauzuli WHERE v Rails

To je případ .

Skutečné definice tabulek (standardní vztah 1:n, skrytý Ruby ORM) budou asi takto:

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

Váš pokus o dotaz se efektivně snaží otestovat každý jednotlivý řádek v fees proti více hodnotám v daném poli, což vždy selže, zatímco prvky pole nejsou identické. Jedna hodnota nemůže být stejná jako násobek jiné hodnoty. Potřebujete jiný přístup:

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

To za předpokladu odlišných hodnoty ve vašem poli a jedinečné položky ve vaší tabulce poplatky jako vynucené UNIQUE omezení, které jsem přidal výše. Jinak počty nejsou spolehlivé a musíte použít sofistikovanější dotaz. Zde je arzenál možností:

Jak vidíte, nezapojil jsem tabulku instructor_student vůbec. Zatímco referenční integrita je vynucována omezením FK (jako obvykle), můžeme pracovat s fees k určení způsobilého instructor_student_id . Pokud potřebujete načíst další atributy z hlavní tabulky, udělejte to ve 2. kroku, například:

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


  1. jak zvýšit délku výstupu sloupce sqlplus?

  2. jak sloučit dvě tabulky, abyste získali poslední nové řádky z tabulky 2 a zbytek z tabulky 1

  3. PDO::ERRMODE_EXCEPTION nepotlačí varování

  4. Kdy použít jednoduché uvozovky, dvojité uvozovky a zadní zaškrtnutí v MySQL