2015-02-02 1 views
0

У меня есть только один SQL-запрос, для которого мне нужна помощь.Получить связанные строки из SQL Server

Как вы можете видеть ниже, есть 4 сообщения электронной почты. 3 из 4 сообщений связаны (15482, 15483 и 15484). Я бы хотел, чтобы эти ряды вышли.

Вы можете связать их друг с другом через столбец messageid = ReplyTo и ReplyTo = MessageID. Это заканчивается рекрусивом.

На приведенном ниже рисунке показано, что у меня есть прямо сейчас, но, как я уже сказал, мне нужны только ID 15482, 15483 и 15484, а не 15485. Поскольку, как видите, первые 3 строки - это поток электронной почты, который висит вместе в то время как последний является новой почты

Как я могу это сделать, когда я только знаю, ID 15482

Это мой SQL заявление

select 
    t1.id, t1.From_, t1.MessageId, t2.ReplyTo 
from 
    HelpDesk_Z01_Emails as t1 
left join 
    HelpDesk_Z01_EmailsReplyTo as t2 on t1.MessageId = t2.MessageId 

Это мой выход:

enter image description here

ответ

1

Вы правильно сказали, что это рекурсия. Обычно это делается с использованием recursive common table expression

Я не уверен, что все в запросе ниже верно. Если бы вы предоставили упрощенный пример с образцовыми данными, можно было бы попробовать предлагаемое решение. Без него запрос записывается, но не проверяется. Попробуйте.

WITH 
CTE 
AS 
(
    SELECT 
     t1.id, t1.From_, t1.MessageId, t2.ReplyTo 
    FROM 
     HelpDesk_Z01_Emails as t1 
     left join HelpDesk_Z01_EmailsReplyTo as t2 on t1.MessageId = t2.MessageId 
    WHERE t1.id = 15482 

    UNION ALL 

    SELECT 
     t1.id, t1.From_, t1.MessageId, t2.ReplyTo 
    FROM 
     HelpDesk_Z01_Emails as t1 
     left join HelpDesk_Z01_EmailsReplyTo as t2 on t1.MessageId = t2.MessageId 
     INNER JOIN CTE ON CTE.MessageId = t2.ReplyTo 
) 
SELECT * 
FROM CTE 
; 

Это скрипт, чтобы сделать упрощенную таблицу с данными выборки, которые вы должны были включены в вашем вопросе:

DECLARE @T TABLE(id int, From_ varchar(255), MessageId varchar(255), ReplyTo varchar(255)); 

INSERT INTO @T (id, From_, MessageId, ReplyTo) VALUES (15482, '[email protected]', 'CAF', NULL); 
INSERT INTO @T (id, From_, MessageId, ReplyTo) VALUES (15483, '[email protected]', '54c', 'CAF'); 
INSERT INTO @T (id, From_, MessageId, ReplyTo) VALUES (15484, '[email protected]', 'Fk', '54c'); 
INSERT INTO @T (id, From_, MessageId, ReplyTo) VALUES (15485, '[email protected]', 'FkMh', NULL); 

Имея такую ​​отправную точку, легко писать и проверить следующее запрос:

WITH 
CTE 
AS 
(
    SELECT 
     TT.id, TT.From_, TT.MessageId, TT.ReplyTo 
    FROM 
     @T AS TT 
    WHERE TT.id = 15482 

    UNION ALL 

    SELECT 
     TT.id, TT.From_, TT.MessageId, TT.ReplyTo 
    FROM 
     @T AS TT 
     INNER JOIN CTE ON CTE.MessageId = TT.ReplyTo 
) 
SELECT * 
FROM CTE 
; 

Результирующий набор:

id  From_  MessageId ReplyTo 
15482 [email protected] CAF   NULL 
15483 [email protected] 54c   CAF 
15484 [email protected] Fk   54c 
+0

Благодарим за помощь :) – Zaz

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