2017-03-16 5 views
0

그래서 나는 그렇게 같은 데이터가 테이블 companyinfo 있습니다. 따라서 John과 Bob이 Google에서 근무했다면 John은 Bob과 1 개의 연결을 통해 Bob을 알지만 John은 Bob보다 Bob이 Alex를 알기 때문에 John은 확장을 통해 알렉스를 알지만 Bob은 2 개의 연결을 의미합니다SQL 재귀 쿼리 포스트 그레스

나는 이것을 아주 간단한 그래프로 이해합니다. , 예는 찾을 않는 알렉스

WITH RECURSIVE search_graph(person, company, n) AS (
    SELECT s.person, s.company, 1 
    FROM companyinfo s 
    WHERE s.person = 'John' 
    UNION 
    SELECT s.person, s.company, n+1 
    FROM companyinfo s, search_graph sg 
    WHERE s.person = 'Alex' 
) 
SELECT * FROM search_graph limit 50; 

그러나 그것은 분명 작동하지 않습니다 문제는 코드에서 해결하지만 난 몇 시간 동안이 작업을 수행하는 재귀 SQL을 작성하는 방법을 알아 내기 위해 노력하고 만 함께했다 그러나 bob과 loops의 부정을 통한 연결을 따르지 않기 때문에 limit 50

명시 : 두 사람이 같은 회사에서 일하면 서로를 알고 있다고 가정합니다. 그 그래프는 다음과 같습니다 :

| John | --dev-- | Google | --tester-- | Bob | --blah-- | Facebook |

사람과 회사는 노드와 역할이 모서리입니다.

+0

테이블 'companyinfo'에는 사람들 간의 연결에 대한 정보가 없습니다. –

+0

나는 분명히해야만했다. 같은 회사에서 근무한 사람들은 서로를 알고있다. – polyx

답변

1

기본 쿼리는 이며 주어진 사람과 같은 회사에서 근무한 사람을 찾습니다. SQL에서 자체 조인 companyinfo으로 변환됩니다. 또한 반복을 피하기 위해 일련의 사람을 사용해야합니다.

with recursive search_graph(person, persons) as (
    select s2.person, array['John'] 
    from companyinfo s1 
    join companyinfo s2 
    on s1.company = s2.company and s1.person <> s2.person 
    where s1.person = 'John' 
union 
    select s2.person, persons || s1.person 
    from companyinfo s1 
    join companyinfo s2 
    on s1.company = s2.company and s1.person <> s2.person 
    join search_graph g 
    on s1.person = g.person 
    where s1.person <> all(persons) 
) 
select distinct persons[cardinality(persons)] person, cardinality(persons) n 
from search_graph 
order by 2; 

person | n 
--------+--- 
John | 1 
Bob | 2 
Alex | 3 
(3 rows)  
+0

굉장하지만, 'order by 2'는 무엇을 하는가? – polyx

+1

'order by n'(두 번째 열 순서)과 동일합니다. – klin