sql >> Database teknologi >  >> RDS >> PostgreSQL

SQL:Vælg poster, hvor ALLE sammenføjede poster opfylder en betingelse

Forudsat at der ikke er behov for korrelation, skal du bruge:

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

Hvis du har brug for korrelation:

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

Forklaring

FINDER evaluerer på en boolean, baseret på det første match - dette gør det hurtigere end at sige at bruge IN, og - i modsætning til at bruge en JOIN - vil ikke duplikere rækker. SELECT-delen er ligegyldig - du kan ændre den til EXISTS SELECT 1/0 ... og forespørgslen vil stadig fungere, selvom der er en åbenlys division med nul fejl.

Underforespørgslen i EXISTS bruger den samlede funktion MIN til at få den mindste B.some_val - hvis denne værdi er større end a.val værdien, er a.val mindre end alle b værdierne. Det eneste behov for en WHERE klausul er til korrelation - aggregerede funktioner kan kun bruges i HAVING klausul.



  1. Få det aktuelle år, den aktuelle måned og den aktuelle dag i MySQL

  2. skal jeg aktivere c3p0 statement pooling?

  3. Sådan aktiverer du massetilladelse i SQL Server

  4. Oracle SQL:tidsstempler i where-sætning