PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Оператор ALL в клауза WHERE в Rails

Това е случай на .

Действителните дефиниции на таблици (стандартна връзка 1:n, скрити от Ruby ORM) ще бъдат нещо подобно:

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

Вашият опит за заявка ефективно се опитва да тества всеки отделен ред в fees срещу множество стойности в дадения масив, което винаги не успее, докато елементите на масива не са идентични. Едно стойността не може да бъде същата като множество други стойности. Имате нужда от различен подход:

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

Това предполага различно стойности във вашия масив и уникални записи във вашата таблица такси като наложени от UNIQUE ограничение, което добавих по-горе. В противен случай преброяването не е надеждно и трябва да използвате по-сложна заявка. Ето арсенал от опции:

Както можете да видите, не използвах таблицата instructor_student изобщо. Докато референтната цялост се налага с FK ограничение (както обикновено), можем да работим с fees сам за определяне на квалифициран instructor_student_id . Ако трябва да извлечете повече атрибути от главната таблица, направете това във втора стъпка, като:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка в PostgreSQL:Връзката вече съществува

  2. SQL заявка:Извличане на подредени редове от таблица - II

  3. F# Свържете SQLProvider с Postgres

  4. Заявка за активен запис за присъединяване на таблица към sql към релси

  5. Postgres json_agg включва заглавка на колона - Неправилен JSON?