PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak interpretowana jest instrukcja SQL with-recursive?

Nie ma tu żadnej „rekurencji” i myślę, że w tym miejscu się mylisz.

Z dokumentacji PostgreSQL:http://www.postgresql.org/docs/9.4/static/queries-with.html

Note: Strictly speaking, this process is iteration not recursion, 
but RECURSIVE is the terminology chosen by the SQL standards committee.

Parafrazując to zdanie, WITH RECURSIVE może być oglądany jako prosty WHILE pętla.

WITH RECURSIVE t(n) AS (
  VALUES (1)
  UNION ALL
  SELECT n+1 FROM t WHERE n < 100
)
SELECT * FROM t;

Oto trochę niestandardowego pseudokodu, który szczegółowo wyjaśnia ten proces

# Step 1: initialisation LET cte_result = EMPTY LET working_table = VALUES (1) LET intermediate_table = EMPTY # Step 2: result initialisation, merge initialisation into cte_result cte_result = cte_result UNION working_table # Step 3: iteration test WHILE (working_table is not empty) DO # Step 4: iteration select, we substitute the self-reference with working_table intermediate_table = SELECT n+1 FROM working_table WHERE n < 100 # Step 5: iteration merge, merge the iteration result into cte_result cte_result = cte_result UNION intermediate_table # Step 6: iteration end, prepare for next iteration working_table = intermediate_table intermediate_table = EMPTY END WHILE # Step 7: return RETURN cte_result

I posługując się przykładem

# Step 1: initialisation
cte_result: EMPTY    | working_table: 1        | intermediate_table: EMPTY

# Step 2: result initialisation
cte_result: 1        | working_table: 1        | intermediate_table: EMPTY

# Step 3: iteration test
count(working_table) = 1 # OK
# Step 4: iteration select
cte_result: 1             | working_table: 1        | intermediate_table: 2
# Step 5: iteration merge
cte_result: 1, 2          | working_table: 1        | intermediate_table: 2
# Step 6: iteration end
cte_result: 1, 2          | working_table: 2        | intermediate_table: EMPTY

# Step 3: iteration test
count(working_table) = 1 # OK
# Step 4: iteration select
cte_result: 1, 2         | working_table: 2        | intermediate_table: 3
# Step 5: iteration merge
cte_result: 1, 2, 3      | working_table: 2        | intermediate_table: 3
# Step 6: iteration end
cte_result: 1, 2, 3      | working_table: 3        | intermediate_table: EMPTY

# … 97 more iterations and you get this state
cte_result: 1, 2, …, 100  | working_table: 100       | intermediate_table: EMPTY

# Step 3: iteration test
count(working_table) = 1 # OK
# Step 4: iteration select, the iteration query does not return any rows due to the WHERE clause
cte_result: 1, 2, …, 100  | working_table: 100       | intermediate_table: EMPTY
# Step 5: iteration merge, nothing is merged into the cte_result
cte_result: 1, 2, …, 100  | working_table: 100       | intermediate_table: EMPTY
# Step 6: iteration end
cte_result: 1, 2, …, 100  | working_table: EMPTY | intermediate_table: EMPTY

# Step 3: iteration test
count(working_table) = 0 # STOP

# Step 7: return
cte_result: 1, 2, …, 100

Wynik CTE to wszystkie liczby od 1 do 100.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Generate_series w Postgresie od daty rozpoczęcia i zakończenia w tabeli

  2. Równoważenie obciążenia PostgreSQL w chmurze stało się proste

  3. lokalne połączenie docker postgres pgadmin

  4. PostgreSQL:Pokaż tabele w PostgreSQL

  5. Indeks PostgreSQL w JSON