PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Operator ALL w klauzuli WHERE w Rails

Tak jest w przypadku .

Rzeczywiste definicje tabel (standardowa relacja 1:n, ukryta przez Ruby ORM) będą wyglądać mniej więcej tak:

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

Twoja próba zapytania skutecznie próbuje przetestować każdy pojedynczy wiersz w fees w stosunku do wielu wartości w danej tablicy, co zawsze kończy się niepowodzeniem, gdy elementy tablicy nie są identyczne. Jeden wartość nie może być taka sama jak wiele inne wartości. Potrzebujesz innego podejścia:

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

Przyjmujemy, że różne wartości w Twojej tablicy i unikalne wpisy w opłatach za tabele, takie jak wymuszone przez UNIQUE ograniczenie, które dodałem powyżej. W przeciwnym razie liczenia nie są wiarygodne i musisz użyć bardziej wyrafinowanego zapytania. Oto arsenał opcji:

Jak widać, nie włączyłem tabeli instructor_student w ogóle. Podczas gdy integralność referencyjna jest wymuszana za pomocą ograniczenia FK (jak zwykle), możemy pracować z fees samodzielnie, aby określić kwalifikujący się instructor_student_id . Jeśli chcesz pobrać więcej atrybutów z głównej tabeli, zrób to w drugim kroku, na przykład:

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. Zapisywanie danych wyjściowych zapytania dynamicznego używającego instrukcji przygotowania do tabeli

  2. Jak połączyć się z bazą danych przez SSH za pomocą DataGrip

  3. Sprawdzanie PL/pgSQL, czy wiersz istnieje

  4. postgresql brak wsparcia dla zapytań parametrizd

  5. kolejność kolumn w instrukcji SELECT * - gwarantowana?