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

Postgresql:Zapytanie zwracające nieprawidłowe dane

Twój WHERE klauzula wybiera wiersze, w których empgroupid to 500 lub 501, a nie empid s gdzie wszystkie empgroupid s tworzą tablicę [500, 501] .

Możesz użyć ARRAY_AGG w HAVING klauzula:

SELECT empid 
FROM empgroupinfo 
GROUP BY empid
-- ORDER BY clause here is important, as array equality checks elements position by position, not just 'same elements as'
HAVING ARRAY_AGG(DISTINCT empgroupid ORDER BY empgroupid) = ARRAY[500, 501]

W zależności od tego, gdzie [500, 501] pochodzi z tablicy, możesz nie wiedzieć, czy sama jest posortowana, czy nie. W takim przypadku "zawiera AND jest zawarty przez" (operatorzy @> i <@ ) też powinno działać.

#= CREATE TABLE empgroupinfo (empid int, empgroupid int);
CREATE TABLE
Time: 10,765 ms

#= INSERT INTO empgroupinfo VALUES (1, 500), (1, 501), (2, 500), (2, 501), (2, 502);
INSERT 0 5
Time: 1,451 ms

#= SELECT empid 
   FROM empgroupinfo 
   GROUP BY empid
   HAVING ARRAY_AGG(empgroupid ORDER BY empgroupid) = ARRAY[500, 501];
┌───────┐
│ empid │
├───────┤
│     1 │
└───────┘
(1 row)

Time: 0,468 ms


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak radzić sobie z ciągle zmieniającym się hasłem w sqlalchemy+psycopg2?

  2. Jak połączyć (Py)Spark z bazą danych Postgres za pomocą JDBC?

  3. Jak można używać składni INSERT ... ON CONFLICT (id) DO UPDATE... z identyfikatorem sekwencji?

  4. Nie można użyć uuid i utworzyć rozszerzenia, aby z niego korzystać

  5. Unikaj wyłącznych blokad dostępu do tabel, do których istnieją odniesienia, podczas opuszczania PostgreSQL