Recursion with SQL
desple.com
desple.com
My favorite ridiculous use-case for them: https://wiki.postgresql.org/wiki/Mandelbrot_set
(For reference, that ran in 252ms on my low-end Linode.)
Postgres CTEs are amazing, though. Surprisingly efficient for our particular usage case (threaded discussions that don't ever get too deep).
If you're running one-off queries, you probably won't have issues using recursion, but there are a lot of instances where you really don't want to run a complex SQL statement for each of the 1M users reading data from your site. Selecting the proper database table structure can help dramatically!
For example, take any data structured as a tree. If there are more writes than reads, it's pretty easy to put new data in place and your read becomes recursive. When you have vastly more reads than writes it's almost always better to "pre-order" the data. I've had good success with using the modified pre-ordered lists for tree structures but other table formats and processing can be used for other data types. Sometimes it's just careful but non-obvious indexing.
To be fair to Oracle, START WITH/CONNECT BY has been available in Oracle a lot longer than CTEs as part of the SQL standard have existed.
There is support in Postgres, sqlite, MSSQL, HSQLDB, Oracle, etc... for CTEs.
You can sort of emulate some recursive SQL properties using a temporary table:
When you get into examples using tables it would be nice if you provided the table definitions and some sample data.
PS: psoug's connect by page (http://psoug.org/reference/connectby.html) is my favorite reference.
A simple use case that I have in my work is generating a date table, and a recursive CTE sits at the core of this script:
TSQL Syntax:
WITH dateCTE (FullDate) AS (SELECT '20100101' UNION ALL SELECT DATEADD(DAY, 1, FullDate) FROM dateCTE WHERE FullDate < 20101231 )
In the example above, we generate a table of all dates in 2010.
I don't get much chance to play with Postgres, but from their documentation[0] it seems the concept transfers over readily by using WITH RECURSIVE.
[0]http://www.postgresql.org/docs/9.4/static/queries-with.html
http://www.postgresql.org/docs/current/static/functions-srf....
It seems we can simulate this behavior in TSQL[0] by using recursive CTEs in a function.
[0]https://developer42.wordpress.com/2014/09/17/t-sql-generate-...
(The following is a link to my own website where I explain it using a Codeigniter library I built. It can be done in any type of code, however) http://codebyjeff.com/blog/2012/10/nested-data-with-mahana-h...
, TO_CHAR(x +1, 'iw') weeknumber
, TO_CHAR(x , 'iw') weeknumber
I guess this might be environmental as some regions may consider the start/end of the week on different days.This doesn't help in a write-heavy use case.
People tend to report the bad cases, and stay silent for the good cases, which can contribute to a sense of fear of the feature. It could have started from a real issue, or it could just be someone trying to solve the traveling salesman problem with fake data and then blogging when it's slow.