sql >> Databáze >  >> RDS >> PostgreSQL

SQL:Vyberte záznamy, kde VŠECHNY spojené záznamy splňují určitou podmínku

Za předpokladu, že není potřeba korelace, použijte:

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

Pokud potřebujete korelaci:

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

Vysvětlení

EXISTS vyhodnocuje na booleanu, na základě první shody – díky tomu je rychlejší než řekněme pomocí IN a – na rozdíl od použití JOIN – nebude duplikovat řádky. Na části SELECT nezáleží – můžete ji změnit na EXISTS SELECT 1/0 ... a dotaz bude stále fungovat, i když je zde zřejmé rozdělení nulovou chybou.

Poddotaz v rámci EXISTS používá agregační funkci MIN k získání nejmenší B.some_val - pokud je tato hodnota větší než hodnota a.val, je a.val menší než všechny hodnoty b. Stačí pouze WHERE klauzule je pro korelaci - agregační funkce lze použít pouze v HAVING doložka.



  1. UTF-8:Obecné? Zásobník? Unicode?

  2. Jak napsat Pandas Dataframe do modelu Django

  3. 2 způsoby, jak vytvořit databázi na propojeném serveru pomocí T-SQL

  4. 4 způsoby, jak zkontrolovat, zda tabulka existuje před jejím umístěním na SQL Server (T-SQL)