从 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
我只有一个 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