2017-11-15 16 views
3

私は2つの基本的なエンティティ、すなわち財務計画と購入要求を持っています。 Theese 2つのエンティティは、多対多の関係にある。多くのエンティティ間でsql接続されたコンポーネントを見つける

CREATE TABLE FinancialPlan 
(
    ID int NOT NULL, 
    PRIMARY KEY (ID) 
); 

CREATE TABLE PurchaseRequest 
(
    ID int NOT NULL, 
    PRIMARY KEY (ID) 
); 

CREATE TABLE FP_PR 
(
    FP_ID FOREIGN KEY REFERENCES FinancialPlan(ID), 
    PR_ID FOREIGN KEY REFERENCES PurchaseRequest(ID) 
); 

問題:指定された計画に関連する、すべての要求を検索し、指定された計画に関連する要求に関連するすべてのプラン、、、...

モデルはグラフとして表すことができます。各ノードは計画または要求を表し、各エッジは関係を表します。は、指定されたノードがに属する接続コンポーネントを見つけるという意味に置き換えられます。

例:

Plan  Request FP_PR 

ID | ID |  FP_ID|PR_ID| 
----| ----|  -----|-----| 
1 | 1 |  1 |1 | 
2 | 2 |  2 |1 | 
3 | 3 |  2 |2 | 
4 |    3 |2 | 
5 |    4 |2 | 
        5 |3 | 

finplan ID = 1つの

所望の出力の連結成分検索:

FP_ID | PR_ID| 
------+------+ 
1  | 1 | 
2  | 1 | 
2  | 2 | 
3  | 2 | 
4  | 2 | 

を私は現在、多くに生成することができた、アプリ側で再帰的にそれをやっていますいくつかの再帰的なDBアプローチでこれを行うことができますか?

視覚化: enter image description here 開始エンティティは矢印でマークされています。 必要な出力が丸で囲まれています。

+0

@Alex、ご質問をお読みください –

+0

私はまた、あなたがMySQLとSQLサーバータグであなたの質問をタグ付け、あなたは単純な用語でそれを説明しようと示唆しています。特定のRDBMSを念頭に置いていますか? – Alex

+0

@Alex、私は視覚的な表現で私の質問を更新しました、少し物事を明確にすることを願っています。 RDBMSに関しては、SQL Serverソリューションを提供する必要がありますが、MySQLソリューションは互換性があるはずです。 –

答えて

1

SQL Serverソリューション

私は主な問題は、あなたがしてPR_IDFP_IDで比較する必要があると思います。したがって、再帰的な部分ではCASEの文が必要です。 1回の実行では、FP_IDのデータをPR_IDなどでモジュロの助けを借りて取得します。

DECLARE @fp int = 1 

;WITH cte AS (
    SELECT f.FP_ID, 
      f.PR_ID, 
      1 as lev 
    FROM #FP_PR f 
    WHERE f.FP_id = @fp 
    UNION ALL 
    SELECT f.FP_ID, 
      f.PR_ID, 
      lev+1 
    FROM cte c 
    CROSS JOIN #FP_PR f -- You can use INNER JOIN instead 
    WHERE CASE (lev+1)%2 WHEN 0 THEN f.PR_ID WHEN 1 THEN f.FP_ID END = CASE (lev+1)%2 WHEN 0 THEN c.PR_ID WHEN 1 THEN c.FP_ID END 
    AND NOT (f.PR_ID = c.PR_ID AND f.FP_ID = c.FP_ID) 
) 

SELECT * 
FROM cte 

出力:

FP_ID PR_ID lev 
1  1  1 
2  1  2 
2  2  3 
3  2  4 
4  2  4 
+0

ご利用いただきありがとうございます、ありがとうございます! –

関連する問題