从 SQL 服务器获取相关行

Get related rows from SQL Server

我只有一个 SQL 查询需要帮助。

如下所示,有 4 封电子邮件。 4 条消息中有 3 条是相关的(15482、15483 和 15484)。我想把这些行去掉。

您可以通过列 messageid = ReplyTo 和 ReplyTo = MessageID 将它们相互关联。它最终成为 recrusiv。

下图显示了我现在拥有的内容,但正如我所说,我只想显示 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

这是我的输出:

你说得对,这是一个递归。 通常使用 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
;

这是使用您应该包含在问题中的示例数据来制作简化 table 的脚本:

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

INSERT INTO @T (id, From_, MessageId, ReplyTo) VALUES (15482, 'test@com', 'CAF', NULL);
INSERT INTO @T (id, From_, MessageId, ReplyTo) VALUES (15483, 'test@com', '54c', 'CAF');
INSERT INTO @T (id, From_, MessageId, ReplyTo) VALUES (15484, 'test@com', 'Fk', '54c');
INSERT INTO @T (id, From_, MessageId, ReplyTo) VALUES (15485, 'test@com', '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    test@com    CAF          NULL
15483    test@com    54c          CAF
15484    test@com    Fk           54c