2017-01-17 2 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. Вы передаете один узел в пути, и вы хотите получить всех участников этого пути (порядок не важен. Может быть, несколько путей (более одного предыдущего/следующего узла)? – Shnugo

+0

@ Шнуго Да, я думаю, что может быть и несколько paths – 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

Смежные вопросы