sql >> Databáze >  >> RDS >> Oracle

Proč nejsou agregační funkce povoleny v klauzuli where

Důvod, proč nemůžete použít SUM() v WHERE klauzule je pořadí hodnocení klauzulí.

FROM vám řekne, odkud číst řádky. Při čtení řádků z disku do paměti se kontroluje, zda se v nich nachází WHERE podmínky. (Ve skutečnosti v mnoha případech řádky, které nevyhovují WHERE klauzule nebude ani načtena z disku. „Podmínky“ jsou formálně známé jako predikáty a některé predikáty se používají – motorem pro provádění dotazů – k rozhodování o tom, které řádky budou čteny ze základních tabulek. Ty se nazývají přístup predikáty.) Jak vidíte, WHERE klauzule se aplikuje na každý řádek tak, jak je prezentován motoru.

Na druhou stranu se agregace provádí až po přečtení všech řádků (které ověřují všechny predikáty).

Zamyslete se nad tímto:SUM() platí POUZE pro řádky, které splňují WHERE podmínky. Pokud vložíte SUM() v WHERE klauzule, žádáte o kruhovou logiku. Přejde nový řádek přes WHERE doložka? Jak bych mohl vědět? Pokud to projde, musím to zahrnout do SUM , ale pokud ne, neměl by být zahrnut do SUM . Jak tedy vůbec vyhodnotím SUM stavu?



  1. Zahoďte milisekundovou část z časového razítka

  2. Někdy MŮŽETE převést sloupec na místě

  3. Jak vytvořit databázi na serveru SQL

  4. Vytvořte objekt DIE na serveru SQL Server