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

Rozdíl mezi klauzulí WITH a poddotazem?

WITH klauzule je pro faktorování poddotazů, známé také jako běžné tabulkové výrazy nebo CTE:

Klauzule WITH název_dotazu umožňuje přiřadit název bloku poddotazu. Poté můžete odkazovat na blok poddotazu na více míst v dotazu zadáním názvu_dotazu. Oracle Database optimalizuje dotaz tak, že s názvem dotazu zachází buď jako s vloženým pohledem, nebo jako s dočasnou tabulkou.

Ve vašem druhém příkladu to, co jste nazvali temp_table je vložený pohled, nikoli dočasná tabulka.

V mnoha případech závisí výběr, který chcete použít, na vašem preferovaném stylu a CTE mohou učinit kód čitelnějším, zejména s více úrovněmi poddotazů (názory se samozřejmě liší). Pokud se na CTE/inline zobrazení podíváte pouze jednou, pravděpodobně neuvidíte žádný rozdíl ve výkonu a optimalizátor může skončit se stejným plánem.

Jsou však zvláště užitečné, když potřebujete použít stejný poddotaz na více než jednom místě, například ve sjednocení. Můžete vytáhnout vložený pohled do CTE, aby se kód neopakoval, a optimalizátoru to umožní zhmotnit, pokud si myslí, že by to bylo přínosné.

Například tento vymyšlený příklad:

select curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr >= 0
union all
select -1 * curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr < 0

lze refaktorovat na:

with temp_table as (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
)
select curr from temp_table
where curr >= 0
union all
select -1 * curr from temp_table
where curr < 0

Poddotaz se již nemusí opakovat. Čím složitější je opakovaný kód, tím výhodnější z hlediska údržby je použití CTE. A čím dražší je poddotaz, tím větší přínos pro výkon můžete vidět z použití CTE, i když optimalizátor je obvykle docela dobrý v tom, aby zjistil, co děláte.



  1. Jak nakonfigurovat Tomcat pro připojení k MySQL

  2. SQLAlchemy:filtrování podle hodnot uložených ve vnořeném seznamu pole JSONB

  3. PostgreSQL:mezi datem a časem

  4. Jak zobrazit soubory protokolu v MySQL?