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

Намерете записи, където присъединяването не съществува

Използвайте EXISTS израз:

WHERE NOT EXISTS (
   SELECT FROM votes v  -- SELECT list can be empty
   WHERE  v.some_id = base_table.some_id
   AND    v.user_id = ?
   )

Разликата

... между NOT EXISTS() (Ⓔ) и NOT IN() (Ⓘ) е двойно:

  1. Ефективност

    Ⓔ обикновено е по-бързо. Той спира да обработва подзаявката веднага щом бъде намерено първото съвпадение. Ръководството:

    Подзаявката обикновено ще се изпълнява достатъчно дълго, за да се определи дали поне един ред е върнат, а не чак до завършване.

    Ⓘ също може да бъде оптимизиран от планировчика на заявки, но в по-малка степен, тъй като NULL манипулирането го прави по-сложно.

  2. Коректност

    Ако една от получените стойности в израза на подзаявката е NULL , резултатът от Ⓘ е NULL , докато общата логика очаква TRUE - и Ⓔ ще върнат TRUE . Ръководството:

    Ако всички резултати на ред са или неравни, или нулеви, с поне една нула, тогава резултатът от NOT IN е нула.

По същество (NOT) EXISTS е по-добрият избор в повечето случаи.

Пример

Вашата заявка може да изглежда така:

SELECT *
FROM   questions q
WHERE  NOT EXISTS (
    SELECT FROM votes v 
    WHERE  v.question_id = q.id
    AND    v.user_id = ?
    );

Не присъединете се към votes в основната заявка. Това ще анулира усилията.

Освен това NOT EXISTS и NOT IN има допълнителни опции за синтаксис с LEFT JOIN / IS NULL и EXCEPT . Вижте:

  • Изберете редове, които не присъстват в друга таблица


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sql заявка, която групира различни елементи в кофи

  2. Как да внедрите високодостъпен PostgreSQL с единична крайна точка за WordPress

  3. PostgreSQL 11 - Процедури

  4. Как да използвам % оператор от разширението pg_trgm?

  5. Как мога да задам ограничение на размера за тип данни int в PostgreSQL 9.5