2014-07-22 4 views
0

나는 그들이 어떻게 연결되어 있는지 지정에서와 섹션에 자신의 각각이지도를 나타내는 연결된 노드의 테이블이 이 맵에서 섹션을 제거하려고 일부 테스트를 실행 중이며 하나의 노드를 선택하여 해당 노드의 모든 노드를 제거하려고합니다. 나는 그런이 의사-SQL과 같은 SQL 쿼리를 통해이 작업을 수행하는 방법을 알고 싶습니다주어진 레코드에서 연결을 추적하는 쿼리를 어떻게 만듭니 니 까? NODENUMBER1 - -에 -에서 - NODENUMBER2 - </blockquote> <p></p>에</p> <blockquote> <p>에서 :

:

select A.nodes from node_table A, node_table B 
where A.to_section = B.from_section 
and **A.starting_node = NODENUMBER_X**; 

그래서 NODENUMBER_X을 설정하여 쿼리는 다운 스트림 NODENUMBER_X의 연결된 모든 노드를 생성 할 것이다.

답변

0

재귀가 효율성을 위해 항상 좋은 것은 아니지만 이러한 문제를 해결하는 방법 중 하나입니다. node_table에 고유 한 필드 node_id (int)가 있다고 가정합니다.

declare @start_node_id int, @loop_limit int, @loop_count int; 

set @start_node_id = 1234; -- Insert the node ID you want to start from. 
set @loop_limit = 1000;  -- Set a limit on the number of loop iterations. 
set @loop_count = 0; 

create table #NODES_TO_DELETE(NODE_ID int); 

-- Get first child nodes, directly linked to start node. 
insert into #NODES_TO_DELETE(NODE_ID) 
select A.NODE_ID 
from node_table A inner join node_table B on B.from_section = A.to_section 
where B.NODE_ID = @start_node_id; 

-- If there are child nodes not yet in our temp table, continue loop. 
WHILE EXISTS(select 1 
    from node_table A inner join node_table B on B.from_section = A.to_section 
    inner join #NODES_TO_DELETE D on B.NODE_ID = D.NODE_ID 
    left join #NODES_TO_DELETE X on A.NODE_ID = X.NODE_ID 
    where X.NODE_ID is null) and 
@loop_count < @loop_limit 
BEGIN 
    -- Add child nodes to temp table. Avoid duplicate IDs. 
    insert into #NODES_TO_DELETE(NODE_ID) 
    select distinct A.NODE_ID 
    from node_table A inner join node_table B on B.from_section = A.to_section 
    inner join #NODES_TO_DELETE D on B.NODE_ID = D.NODE_ID 
    left join #NODES_TO_DELETE X on A.NODE_ID = X.NODE_ID 
    where X.NODE_ID is null; 

    -- Increment loop count. 
    set @loop_count = @loop_count + 1; 
END 

IF @loop_count > @loop_limit 
    print 'Loop limit exceeded.'; -- We've exceeded our loop limit. May not have all matches. 
ELSE 
    delete N -- Delete all nodes inserted into our temp table. 
    from node_table N 
    inner join #NODES_TO_DELETE D on N.NODE_ID = D.NODE_ID; 

drop table #NODES_TO_DELETE; 
관련 문제