Yeah - I've been looking around and I think you're
right.

This is really quite astonishing - seems like a pretty
fundamental concept...

Thanks anyway!


--- Chris <[EMAIL PROTECTED]> wrote:
> No similar operation in SQL unfortunately.  Wish
> there was though...
> 
> Good Luck.
> Chris
> 
> ----------------------------------------------
> Original Message
> From: "Richard Heiser"<[EMAIL PROTECTED]>
> Subject: Re:RE: SQL syntax for Supertypes-Subtypes
> AKA Circular Reference
> AKA Entity Tree
> Date: Wed, 27 Aug 2003 10:32:02 -0700 (PDT)
> 
> >Um, I appreciate the response!  But this is way
> over
> >my head.  Does SQL Server really not have a
> >counterpart to Oracle's functions "START WITH" and
> >"CONNECT BY PRIOR"???
> >
> >Seemed like such a simply query in Oracle:
> >
> >><CFQUERY NAME="GetEntities"
> >> DATASOURCE="MyDatasource">
> >> >  SELECT iEntityID, iSubEntityOf, sName
> >> >  FROM Mytable
> >> >  WHERE NOT iEntityID
> >> >  START WITH iEntityID=1
> >> >  CONNECT BY PRIOR iEntityID=iSubEntityOf
> >> ></CFQUERY>
> >
> >Thanks!
> >
> >-Richard
> >
> >
> >--- Chris <[EMAIL PROTECTED]> wrote:
> >> Here is a stored procedure I used for an old
> forum
> >> app.  Should work for
> >> your situation.
> >> 
> >> --DROP TABLE #stack
> >> --DROP TABLE #x
> >> --DROP TABLE #y
> >> --CREATE PROCEDURE expand (@current int) as
> >> DECLARE @current int
> >> DECLARE @level int, @line char(20)
> >> DECLARE @Pos int
> >> DECLARE @PrevReplyTo int
> >> CREATE TABLE #stack (item int, Thislevel int)
> >> CREATE TABLE #x (ID int, Name varchar(256),
> >> DateCreated datetime, InReplyTo
> >> int, Topic int, TotalReply int, Creator int,
> IsTop
> >> bit, Root int, TopDate
> >> datetime, _USER_ID int, MessageFrom
> >> varchar(256),ThisLevel int, Position
> >> int)
> >> CREATE TABLE #y (ID int, InReplyTo int, Root int)
> >> SET @current = 94
> >> SET @Pos = 0
> >> SET @PrevReplyTo = @current
> >> INSERT #y
> >>    SELECT ID,InReplyTo, Root
> >>    FROM Threads
> >>    WHERE Root = @current
> >>    ORDER BY DateCreated DESC
> >> 
> >> INSERT #x
> >>    SELECT  Threads.ID AS "ID",
> >>                    Threads.Name AS "Name",
> >>                    Threads.DateCreated AS "DateCreated",
> >>                    Threads.InReplyTo AS "InReplyTo",
> >>                    Threads.Topic AS "Topic",
> >>                    Threads.TotalReply AS "TotalReply",
> >>                    Threads.Creator AS "Creator",
> >>                    Threads.IsTop AS "IsTop",
> >>                    Threads.Root AS "Root",
> >>                    Threads.TopDate AS "TopDate",
> >>                    Users.ID AS "_USER_ID",
> >>                    Users.Userid AS "MessageFrom",
> >>                    0,
> >>                    0
> >>    FROM Threads,Users 
> >>    WHERE Threads.Root = @current AND
> Threads.Creator =
> >> Users.ID
> >> 
> >> SET NOCOUNT ON
> >> INSERT INTO #stack VALUES (@current, 1)
> >> SELECT @level = 1
> >>   
> >> WHILE @level > 0
> >> BEGIN
> >>    IF EXISTS (SELECT * FROM #stack WHERE Thislevel
> =
> >> @level)
> >>    BEGIN
> >>            -- If an item on the stack exists at this
> level,
> >> grab it
> >>            SELECT @current = item FROM #stack WHERE
> Thislevel
> >> = @level
> >> 
> >>            -- Increment the position
> >>            SET @Pos = @Pos + 1
> >>            -- Update the table with the new position
> >>            UPDATE #x SET Position = @Pos, ThisLevel =
> @level
> >> - 1 WHERE ID = @current
> >>            -- Delete this entry from the temp table (#y)
> >>            DELETE FROM #y WHERE ID = @current
> >> 
> >>            -- Delete this entry from the stack
> >>            DELETE FROM #stack WHERE Thislevel = @level AND
> >> item = @current
> >>            -- Insert into the stack any IDs that are
> replies
> >> to the CURRENT ID
> >>            INSERT #stack   SELECT ID, @level + 1 FROM #y
> WHERE
> >> InReplyTo = @current
> >>            -- If any were found, increment the level
> >> 
> >>            IF @@ROWCOUNT > 0
> >>                    SELECT @level = @level + 1
> >>    END
> >>    ELSE
> >>            SELECT @level = @level - 1
> >> 
> >>    
> >>    IF ((SELECT COUNT(*) FROM #y) > 0 AND (SELECT
> >> COUNT(*) FROM #stack) = 0)
> >>    BEGIN
> >>            IF @level = 0
> >>                    SELECT @level = @level + 1
> >>    
> >>            INSERT #stack
> >>            SELECT ID, @level + 1 FROM #y
> >>            SELECT * FROM #stack
> >>    END
> >> 
> >> END -- WHILE
> >> 
> >> DROP TABLE #stack
> >> SELECT ID,Name,ThisLevel,Position FROM #x ORDER
> BY
> >> Position,DateCreated
> >> 
> >> 
> >> DROP TABLE #x
> >> DROP TABLE #y
> >> 
> >> 
> >> 
> >> 
> >> 
> >> ----------------------------------------------
> >> Original Message
> >> From: "Hagan, Ryan Mr (Contractor
> >> ACI)"<[EMAIL PROTECTED]>
> >> Subject: RE: SQL syntax for Supertypes-Subtypes
> AKA
> >> Circular Reference AKA
> >> Entity Tree
> >> Date: Wed, 27 Aug 2003 11:21:52 -0400
> >> 
> >> >I asked a very similar question a few weeks ago.
> 
> >> One solution was posted
> >> by
> >> >Jochem van Dieten:
> >> >
> >> >Use a nested set model, or use a 2 table model
> >> where one table holds 
> >> >complete trees in an XMLData field (which you
> only
> >> need to edit when a 
> >> >new element is inserted) and one holds
> individual
> >> messages but with an 
> >> >FK to the table that holds the complete trees in
> >> XML.
> >> >I usually prefer the first solution, but in some
> >> cases the latter 
> >> >solution allows you to offload the whole thing
> to
> >> the client and let the 
> >> >client figure it out using XSLT. Something like:
> 
> >>
>
>>http://spike.oli.tudelft.nl/jochemd/test/tree/test.xml
> >> >
> >> >
> >> >If you want more info, check out the archives. 
> The
> >> thread was:
> >> >
> >> >Re: recursion in cold fusion ( was RE: Creating
> a
> >> list with infinite
> >> >groupings and indents )
> >> >
> >> >
> >> >-----Original Message-----
> >> >From: Blum, Jason (SAA)
> >> [mailto:[EMAIL PROTECTED]
> >> >Sent: Wednesday, August 27, 2003 11:13 AM
> >> >To: CF-Talk
> >> >Subject: SQL syntax for Supertypes-Subtypes AKA
> >> Circular Reference AKA
> >> >Entity Tree
> >> >
> >> >
> >> >Hello,
> >> >
> >> >Here's a puzzle for all you 'Joe Celko' types:
> >> >
> >> >Am trying to figure out how to do on SQL Server
> >> something I can do in
> >> >Oracle.  I think this problem is variously known
> as
> >> Subtypes-Supertypes,
> >> >Circular Reference, Entity Tree, etc...
> >> >
> >> >Given this data:
> >> >
> >> >Columns: iEntityID, iSubEntityOf, sName
> >> >1 1 Mary 
> >> >2 2 1 Fritz 
> >> >3 3 1 John 
> >> >4 4 2 Abu 
> >> >5 5 2 Ludwig 
> >> >6 6 3 Abigail 
> >> >7 7 3 Josef 
> >> >8 8 6 Mark 
> >> >9 9 6 Ben 
> >> >10 10 6 Habib 
> >> >11 11 9 Paul 
> >> >12 12 11 Mahatma
> >> >
> >> >I want to graphically represent the tree in this
> >> data - i.e. Mary is the
> >> >boss; Fritz and John report to Mary; Abu and
> Ludwig
> >> report to Fritz;
> >> >etc...
> >> >
> >> >The important thing is that the SubEntityOf
> column
> >> is kind of a foreign
> >> >key to the primary key EntityID, such that the
> tree
> >> can be infinitely
> >> >deep.
> >> >
> >> >I used to be able to do this in Oracle using:
> >> >
> >> ><CFQUERY NAME="GetEntities"
> >> DATASOURCE="MyDatasource">
> >> >  SELECT iEntityID, iSubEntityOf, sName
> >> >  FROM Mytable
> >> >  WHERE NOT iEntityID
> >> >  START WITH iEntityID=1
> >> >  CONNECT BY PRIOR iEntityID=iSubEntityOf
> >> ></CFQUERY>
> >> >
> >> >But I can't use these functions in SQL Server...
> >> >
> >> >Thanks!
> >> >
> >> >-Jason
> >> >
> >> >
> >>
> >
> >
>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Archives: http://www.houseoffusion.com/lists.cfm?link=t:4
Subscription: http://www.houseoffusion.com/lists.cfm?link=s:4
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.4

Signup for the Fusion Authority news alert and keep up with the latest news in 
ColdFusion and related topics. 
http://www.fusionauthority.com/signup.cfm

Reply via email to