CTE - wyjasnienie

0

Cześć,
Czy możecie w jakiś przystępny sposób wyjaśnić mi zasadę i potrzebę stosowania CTE (z select) na bazie danych?
Najlepiej jakiś prosty praktyczny przykład.
Z góry dzieki

pozdrawiam

0

Prosto to możesz sobie tłumaczyć jako tabelę tymczasową która jest tworzona na czas wykonywania zapytania. Możesz jej używać w całym zapytaniu, łączyć z innymi fizycznymi tabelami bądź innymi CTE, agregować i co tylko sobie zażyczysz. Analogicznie jak tzw. derived tables które się zapisuje w stylu:

select * from (select sum(a.fld_a), sum(b.fld_b), a.fld_c from table_a a join table_b b on a.id = b.id group by a.fld_c)

Zamiast używać takiej formuły dla mnie osobiście wygodniej użyć CTE i zapisać to jako:

witch CTE_TEMP as(
  select sum(a.fld_a), sum(b.fld_b) from table_a a join table_b b on a.id = b.id group by a.fld_c
)
select * from CTE_TEMP
0

@hauleth jakimś tam mega specem od zapytań nie jestem. Nie mniej jednak z moich doświadczeń wynika, że w 99% plan zapytania w Firebirdzie w przypadku CTE oraz zapytania skorelowanego był taki sam. Nie mniej jednak ja jakichś tam bardzo skomplikowanych zapytań nie robię. Nie mniej jednak faktycznie może być tak jak piszesz. Dlatego pisząc ręcznie zapytania zawsze przeglądam plany i od razu widać, że coś nie tak.

Nie mniej jednak z ciekawości sprawdziłem zapytanie oraz plan takie zapytanie jak pokazałeś i Firebird wybrał mi rekord korzystając z indeksu za pomocą jednego odczytu.:

Query
------------------------------------------------
WITH tmp AS (SELECT * FROM TABLE) SELECT id FROM tmp WHERE id = 89446

Plan
------------------------------------------------
PLAN (TMP TABLEINDEX (PK_TABLE))

Query Time
------------------------------------------------
Prepare       : 0,00 ms
Execute       : 0,00 ms
Avg fetch time: 0,00 ms

Memory
------------------------------------------------
Current: 9 181 296
Max    : 9 467 296
Buffers: 2 048

Operations
------------------------------------------------
Read   : 2
Writes : 0
Fetches: 9
Marks  : 0


Enchanced Info:
+--------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|  Table Name        |  Records  |  Indexed  | Non-Indexed | Updates | Deletes | Inserts | Backouts |  Purges  | Expunges |
|                    |   Total   |   reads   |    reads    |         |         |         |          |          |          |
+--------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|TABLE               |    953923 |         1 |           0 |       0 |       0 |       0 |        0 |        0 |        0 |
+--------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+

Zaś plan zapytania był taki sam jak w przypadku zwykłego selecta bez CTE

1 użytkowników online, w tym zalogowanych: 0, gości: 1