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

SQL:Wybierz rekordy, w których WSZYSTKIE połączone rekordy spełniają pewien warunek

Zakładając, że nie ma potrzeby korelacji, użyj:

SELECT a.*
  FROM A a
 WHERE EXISTS(SELECT NULL
                FROM B b
              HAVING MIN(b.some_val) > a.val)

Jeśli potrzebujesz korelacji:

SELECT a.*
  FROM A a
 WHERE EXISTS(SELECT NULL
                FROM B b
               WHERE b.id = a.id
              HAVING MIN(b.some_val) > a.val)

Wyjaśnienie

EXISTS ocenia na podstawie wartości logicznej, na podstawie pierwszego dopasowania — to czyni to szybciej niż powiedzmy przy użyciu IN i — w przeciwieństwie do używania JOIN — nie powiela wierszy. Część SELECT nie ma znaczenia - możesz ją zmienić na EXISTS SELECT 1/0 ... a zapytanie nadal będzie działać, chociaż istnieje oczywisty błąd dzielenia przez zero.

Podzapytanie w EXISTS używa funkcji agregującej MIN, aby uzyskać najmniejszą wartość B.some_val — jeśli ta wartość jest większa niż wartość a.val, a.val jest mniejsza niż wszystkie wartości b. Jedyną potrzebą jest WHERE Klauzula dotyczy korelacji - funkcje agregujące mogą być używane tylko w HAVING klauzula.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyzwania związane ze skalowaniem bazy danych Moodle PostgreSQL

  2. Automatyczne przełączanie awaryjne bazy danych Moodle PostgreSQL

  3. Jak przywrócić pojedynczą tabelę z kopii zapasowej .sql postgresql?

  4. Interwał dopasowania PostgreSQL między czasem rozpoczęcia i zakończenia względem znacznika czasu

  5. Jak wyświetlić bazy danych i tabele w PostgreSQL za pomocą psql