簡體   English   中英

SQL遞歸查詢Postgres

[英]SQL Recursive query Postgres

所以我有一個表companyinfo,它的數據如下:

company |    role      |    person
--------|--------------|------------
Google  | dev          | John
Google  | tester       | Bob
Facebook| manager      | Alex
Facebook| blah         | Bob

我想通過約翰了解人們有多少個“聯系”。 因此,如果約翰和鮑勃在Google工作,那么約翰會通過1個關聯來了解鮑勃,但是如果約翰知道鮑勃並且鮑勃也知道亞歷克斯,那么約翰也會通過擴展名來識別alex,但是通過鮑勃意味着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;

但這顯然行不通,是的,它確實找到了亞歷克斯,但不是因為通過bob和循環進行不忠追蹤,因此limit 50

說明:如果兩個人在同一家公司工作,我們假設他們彼此了解。 因此該圖看起來像這樣:

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

這樣,人和公司是節點,角色是邊緣。

基本查詢是查找與給定人員在同一公司工作的人員 ,這些人員在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)    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM