2017-01-17 21 views
1

与えられた値にリンクされているエントリを取得します。SQLは、私がこれに似たデータベースを持っている

Example Table

あなたが得ることができる場所私はリンクされ、以下によって表からすべての値を取得するクエリを探して値。私は私の英語でこれをどのように表現するのか、私がGoogleを介して適切な解決策を見つけるのはなぜ難しいのか、本当にわからない。

例:のCd 結果は今、このようなものでなければなりません:AB、BC、CD、DE、Efの(結果をソートする必要はありません)

私が値を持っています

ご協力ありがとうございます!

+1

[ツリー構造内のすべてのメンバーを検索]の可能複製(HTTP ://stackoverflow.com/questions/40631222/find-all-members-in-a-tree-structure) –

+0

これを明確にするには:C2が次のC1に、またはその逆にC1のパスが存在する以前のC2に接続します。パス内の1つのノードを渡して、このパスのすべてのメンバーを取得したい(重要ではない)複数のパスが存在する可能性がある(複数の前/次ノード)? – Shnugo

+0

@ Shnugoはい、パス – MattLance

答えて

3

私が正しく理解している場合は、リンクの両方の方法に従うことができますので、あなたは、この使用して再帰共通テーブル式のようにそれを行うことができます。

CREATE TABLE #t (C1 varchar(2), C2 varchar(2)); 

INSERT INTO #t values('Ab','Bc'); 
INSERT INTO #t values('Bc','Cd'); 
INSERT INTO #t values('Cd','De'); 
INSERT INTO #t values('De','Ef'); 
INSERT INTO #t values('Gh','Hi'); 
INSERT INTO #t values('Hi','Ij'); 

DECLARE @start varchar(2) = 'Cd'; 

WITH cte(vC1, vC2) AS 
(
    SELECT C1, C2 FROM #t WHERE C1 = @start 
    UNION ALL 
    SELECT C1, C2 FROM #t INNER JOIN cte ON vC2 = C1 
), 
cte2(vC1, vC2) AS 
(
    SELECT C1, C2 FROM #t WHERE C2 = @start 
    UNION ALL 
    SELECT C1, C2 FROM #t INNER JOIN cte2 ON vC1 = C2 
) 
SELECT vC1 FROM cte 
UNION -- unions here add an implicit DISTINCT 
SELECT vC2 FROM cte 
UNION 
SELECT vC1 FROM cte2 
UNION 
SELECT vC2 FROM cte2 
+0

私はそのアプローチが好き、私の側に+1フォーム – Shnugo

+0

うわー、ありがとう、たくさん。私が現時点で見ることができる限り、これは完全に動作します! – MattLance

関連する問題