[dba-SQLServer] Recursive Queries in Microsoft SQL Server 2008

Gustav Brock gustav at cactus.dk
Mon Oct 28 10:06:34 CDT 2013


Hi Arthur

So the WITH .. AS isolates the inner part? 
Normally, in pure SQL, you can't let a query pull data from itself without
getting a circular reference error or the like.

/gustav

-----Oprindelig meddelelse-----
Fra: dba-sqlserver-bounces at databaseadvisors.com
[mailto:dba-sqlserver-bounces at databaseadvisors.com] På vegne af Arthur
Fuller
Sendt: 28. oktober 2013 14:40
Til: Discussion concerning MS SQL Server
Emne: Re: [dba-SQLServer] Recursive Queries in Microsoft SQL Server 2008

Gustav,

Following the WITH is the name of the alias being defined, along with its
parameter, and its definition follows the first AS. Now jump down to the
INNER JOIN line, and notice that it's calling itself (i.e. the alias just
defined).

So each row has a menuid and also a parentid. What the JOIN does is link the
child rows to their parent using their parentid to their parent's menuid. In
other words it's a self-join; the table is joined to itself. The child rows'
parentid contains the menuid that identifies its parent row.
Because it's an INNER JOIN, eventually it will fail, in which case you've
traversed the tree all the way to its outermost leaves.

Does that help?

Arthur


On Mon, Oct 28, 2013 at 9:28 AM, Gustav Brock <gustav at cactus.dk> wrote:

> Hi all
>
> I'm a noob when it comes to T-SQL - try to limit myself to tables and
views
> - so could someone please explain what is going on here?
> What does this WITH mean?
> How would you retrieve the data from Access?
> Is "vParent = null" valid code in T-SQL? Why not "vParent is null"?
>
> <SQL>
> WITH security_menu_Recursive(Parent,MenuId,MenuName,LEVEL) AS
> (
>     SELECT vparent,vmenuid,vmenuname,0 AS LEVEL FROM dbo.SecurityMenu
WHERE vParent = null
>     UNION ALL
>     SELECT vparent,vmenuid,vmenuname,Level + 1 AS LEVEL FROM
dbo.SecurityMenu
>     INNER JOIN security_menu_Recursive AS smr ON smr.menuid =
dbo.SecurityMenu.vParent
> )
> SELECT parent,menuid,menuname,LEVEL FROM security_menu_Recursive 
> </SQL>
>
> The full tip is here:
>
>
>
http://www.codeproject.com/Articles/674287/Recursive-Queries-in-Microsoft-SQ
L-Server-2008
>
> /gustav 





More information about the dba-SQLServer mailing list