sql >> Databasteknik >  >> RDS >> PostgreSQL

SQL:Välj poster där ALLA sammanfogade poster uppfyller något villkor

Förutsatt att det inte behövs någon korrelation, använd:

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

Om du behöver 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)

Förklaring

EXISTS utvärderar på en boolean, baserat på den första matchningen - detta gör det snabbare än att säg att använda IN, och - till skillnad från att använda en JOIN - kommer inte att duplicera rader. SELECT-delen spelar ingen roll - du kan ändra den till EXISTS SELECT 1/0 ... och frågan kommer fortfarande att fungera även om det finns en uppenbar division med nollfel.

Underfrågan inom EXISTS använder aggregatfunktionen MIN för att få det minsta B.some_val - om det värdet är större än a.val-värdet är a.val mindre än alla b-värden. Det enda behovet av en WHERE sats är för korrelation - aggregerade funktioner kan endast användas i HAVING klausul.



  1. Genererar sql-kod programmatiskt

  2. Hur man infogar en sträng i en annan sträng i SQL Server med STUFF()

  3. Högre kardinalitetskolumn först i ett index när man involverar ett intervall?

  4. MySQL MOD() Funktion – Utför en Modulo Operation i MySQL