sql >> Database >  >> RDS >> PostgreSQL

SQL:selecteer records waarbij ALLE samengevoegde records aan een bepaalde voorwaarde voldoen

Ervan uitgaande dat er geen correlatie nodig is, gebruikt u:

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

Als je correlatie nodig hebt:

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

Uitleg

De EXISTS evalueert op een boolean, gebaseerd op de eerste overeenkomst - dit maakt het sneller dan bijvoorbeeld IN te gebruiken, en - in tegenstelling tot het gebruik van een JOIN - zal het geen rijen dupliceren. Het SELECT-gedeelte doet er niet toe - u kunt het wijzigen in EXISTS SELECT 1/0 ... en de query zal nog steeds werken, hoewel er een duidelijke fout bij deling door nul is.

De subquery binnen de EXISTS gebruikt de aggregatiefunctie MIN om de kleinste B.some_val te krijgen - als die waarde groter is dan de a.val-waarde, is de a.val kleiner dan alle b-waarden. De enige behoefte aan een WHERE clausule is voor correlatie - geaggregeerde functies kunnen alleen worden gebruikt in de HAVING clausule.



  1. DROP-FUNCTIE zonder het aantal/type parameters te kennen?

  2. GETDATE() Voorbeelden in SQL Server (T-SQL)

  3. Tijdreeksen genereren tussen twee datums in PostgreSQL

  4. Hoe te kopiëren van CSV-bestand naar PostgreSQL-tabel met headers in CSV-bestand?