私は次のような関係があります。私は何をしようとしているRecusive SQLクエリ
会社概要(会社、役割、従業員)
は二人の従業員間の最短「パス」を見つけることです。
例
私はジョーとピーターの間の距離を見つける必要があります。 ジョーはA社のCEOであり、アレックスという人は役員です。 AlexはB社のCEO、PeterはB社の副社長です。その後、JoeとPeterの距離は2になります。同じ会社でJoeとPeterが役割を果たす場合、1となります。
私は再帰的なSQLを使用してこれを解決する必要があります。これまでのところ、ベースケースと最終的な選択文字列を考え出しましたが、私の人生は再帰的な部分を理解できません。
WITH RECURSIVE shortest_path(c1,p1,c2,p2, path) AS (
-- Basecase --
SELECT c1.company, c1.person, c2.company, c2.person, array[c1.person, c2.person]
FROM CompanyInfo c1
INNER JOIN CompanyInfo c2 ON c1.company = c2.company
WHERE c1.person = 'Joe'
AND c1.person <> c2.person
UNION ALL
-- Recursive --
-- This is where I'm stuck.
)
SELECT p1, p2, array_length(path,1) -1 as distance
FROM shortest_path
WHERE p2 = 'Peter'
ORDER BY distance
LIMIT 1;
サンプルデータ
CREATE TABLE CompanyInfo (
company text,
role text,
employee text,
primary key (company, role, employee)
);
insert into CompanyInfo values('Company A', 'CEO', 'Joe');
insert into CompanyInfo values('Company A', 'Board member', 'Alex');
insert into CompanyInfo values('Company B', 'CEO', 'Alex');
insert into CompanyInfo values('Company B', 'Board member', 'Peter');
予想される出力
person 1 | person 2 | distance
Joe Peter 2
使用しているdbmsにタグを付けます。 (そのコードは製品固有のものです) – jarlh
今すぐタグを追加しました@jarlh –
すばらしい、あなたが今注目を集めることを願っています! – jarlh