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

SQL:Изберете записи, където ВСИЧКИ съединени записи отговарят на някакво условие

Ако приемем, че няма нужда от корелация, използвайте:

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

Ако имате нужда от корелация:

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

Обяснение

EXISTS оценява на булева, въз основа на първото съвпадение - това го прави по-бърз, отколкото да кажем с IN и - за разлика от използването на JOIN - няма да дублира редове. Частта SELECT няма значение - можете да я промените на EXISTS SELECT 1/0 ... и заявката ще продължи да работи, въпреки че има очевидна грешка при деление на нула.

Подзаявката в EXISTS използва агрегатната функция MIN, за да получи най-малкия B.some_val - ако тази стойност е по-голяма от стойността a.val, a.val е по-малка от всички b стойности. Единствената нужда от WHERE клаузата е за корелация - агрегатните функции могат да се използват само в HAVING клауза.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Върнете идентификатора, ако съществува ред, INSERT в противен случай

  2. Създаване на високодостъпна база данни за Moodle с помощта на PostgreSQL

  3. Мигриране от Postgres към SQL Server 2008

  4. Изхвърлете част от милисекундата от времевата марка

  5. Как search_path влияе върху разделителната способност на идентификатора и текущата схема