PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

ALL operador na cláusula WHERE no Rails


Esse é um caso de .

As definições reais da tabela (relação padrão 1:n, oculta pelo Ruby ORM) serão algo assim:
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)
);

Sua tentativa de uma consulta efetivamente tenta testar cada linha em fees contra vários valores na matriz fornecida, que sempre falha enquanto os elementos da matriz não são idênticos. Um o valor não pode ser igual a múltiplos outros valores. Você precisa de uma abordagem diferente:
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[]);

Isso está assumindo distinto valores em sua matriz e entradas exclusivas em suas taxas de tabela, conforme aplicado pelo UNIQUE restrição que adicionei acima. Caso contrário, as contagens não são confiáveis ​​e você precisa usar uma consulta mais sofisticada. Aqui está um arsenal de opções:

Como você pode ver, eu não envolvi a tabela instructor_student de forma alguma. Embora a integridade referencial seja imposta com uma restrição FK (como normalmente é), podemos trabalhar com fees sozinho para determinar o instructor_student_id qualificado . Se você precisar buscar mais atributos da tabela principal, faça isso em uma 2ª etapa, como:
SELECT i.*  -- or whatever you need
FROM   instructor_student i
JOIN  (
   SELECT ...  -- query from above
   ) f ON f.instructor_student_id = i.id
;