如何为此 SQL 查询编写左外连接?
How to Write Left Outer join for this SQL query?
我有一个table喜欢
ParsereplyId Message Callid status EMailid subject
------------------------------------------------------------------------
1 hi 2222 Replied g.m.p@m.com Log a cll
2 hello 2222 Replied g.m.p@m.com Re:
3 hi2 2222 New g.m.p@m.com Re:log a cll
4 hello2 2223 Read g.p@m.com Log a cldf
5 how r u 2223 New g.p@m.com Re:Log a
从上面table我想得到以下输出:
ParsereplyId Message Callid status EMailid subject
-------------------------------------------------------------------
3 hi2 2222 New g.m.p@m.com Re:log a cll
5 how r u 2223 New g.p@m.com Re:Log a
我试过以下查询。
但我想在 Left outer Join
中进行
SELECT A.[ParsedReplyId]
, A.[EMailId]
, A.[Message]
, A.[CallId]
, [UM_User].[UserName]
FROM IM_IncidentReplyMail AS A
INNER JOIN
(SELECT MAX(ParsedReplyId) AS parseid
FROM [IM_IncidentReplyMail]
GROUP BY [CallId]) AS B
INNER JOIN
[UM_User] ON [UM_User].[EmailId] = A.[EmailId]
WHERE
B.parseid = A.[ParsedReplyId]
如何实现上面的sql内连接查询??
编辑:我更正了上面的错误
UM_USer table 包含 username, emailid
,根据来自两个 table 的电子邮件 ID,我可以获得该邮件的用户名。
编辑 2:
我可以使用 Left outer join 而不是像
这样的 inner join
SELECT A.[ParsedReplyId]
, A.[EMailId]
, A.[Message]
, A.[CallId]
, [UM_User].[UserName]
FROM IM_IncidentReplyMail AS A
LEFT OUTER JOIN
(SELECT MAX(ParsedReplyId) AS parseid
FROM [IM_IncidentReplyMail]
GROUP BY [CallId]) AS B
ON 1=1
LEFT OUTER JOIN
[UM_User] ON [UM_User].[EmailId] = A.[EmailId]
WHERE
B.parseid = A.[ParsedReplyId]
这里我使用了 1=1 条件,这不是查询中使用的正确方法。它使我的代码变得丑陋。所以我请求你帮助解决这个问题。
我已经根据您要求的输出修改了查询
DECLARE @Table1 TABLE
(Id INT, Message VARCHAR(7), Call INT, status VARCHAR(7), EMail VARCHAR(11), subject VARCHAR(12))
;
INSERT INTO @Table1
(Id, Message, Call, status, EMail, subject)
VALUES
(1, 'hi', 2222, 'Replied', 'g.m.p@m.com', 'Log a cll'),
(2, 'hello', 2222, 'Replied', 'g.m.p@m.com', 'Re:'),
(3, 'hi2', 2222, 'New', 'g.m.p@m.com', 'Re:log a cll'),
(4, 'hello2', 2223, 'Read', 'g.p@m.com', 'Log a cldf'),
(5, 'how r u', 2223, 'New', 'g.p@m.com', 'Re:Log a')
;
SELECT T.Id,
TT.Message,
TT.Call,
TT.status,
TT.EMail,
TT.subject
FROM @Table1 tt
LEFT OUTER JOIN
(
SELECT Id,
MAX(subject) OVER(PARTITION BY call ORDER BY call) subject,
MAX(Message) OVER(PARTITION BY call ORDER BY call) Message FROM @Table1)T
ON T.Id = TT.Id AND T.Message = TT.Message AND T.subject = TT.subject
WHERE T.id IS NOT NULL
我有一个table喜欢
ParsereplyId Message Callid status EMailid subject
------------------------------------------------------------------------
1 hi 2222 Replied g.m.p@m.com Log a cll
2 hello 2222 Replied g.m.p@m.com Re:
3 hi2 2222 New g.m.p@m.com Re:log a cll
4 hello2 2223 Read g.p@m.com Log a cldf
5 how r u 2223 New g.p@m.com Re:Log a
从上面table我想得到以下输出:
ParsereplyId Message Callid status EMailid subject
-------------------------------------------------------------------
3 hi2 2222 New g.m.p@m.com Re:log a cll
5 how r u 2223 New g.p@m.com Re:Log a
我试过以下查询。 但我想在 Left outer Join
中进行SELECT A.[ParsedReplyId]
, A.[EMailId]
, A.[Message]
, A.[CallId]
, [UM_User].[UserName]
FROM IM_IncidentReplyMail AS A
INNER JOIN
(SELECT MAX(ParsedReplyId) AS parseid
FROM [IM_IncidentReplyMail]
GROUP BY [CallId]) AS B
INNER JOIN
[UM_User] ON [UM_User].[EmailId] = A.[EmailId]
WHERE
B.parseid = A.[ParsedReplyId]
如何实现上面的sql内连接查询??
编辑:我更正了上面的错误
UM_USer table 包含 username, emailid
,根据来自两个 table 的电子邮件 ID,我可以获得该邮件的用户名。
编辑 2: 我可以使用 Left outer join 而不是像
这样的 inner join SELECT A.[ParsedReplyId]
, A.[EMailId]
, A.[Message]
, A.[CallId]
, [UM_User].[UserName]
FROM IM_IncidentReplyMail AS A
LEFT OUTER JOIN
(SELECT MAX(ParsedReplyId) AS parseid
FROM [IM_IncidentReplyMail]
GROUP BY [CallId]) AS B
ON 1=1
LEFT OUTER JOIN
[UM_User] ON [UM_User].[EmailId] = A.[EmailId]
WHERE
B.parseid = A.[ParsedReplyId]
这里我使用了 1=1 条件,这不是查询中使用的正确方法。它使我的代码变得丑陋。所以我请求你帮助解决这个问题。
我已经根据您要求的输出修改了查询
DECLARE @Table1 TABLE
(Id INT, Message VARCHAR(7), Call INT, status VARCHAR(7), EMail VARCHAR(11), subject VARCHAR(12))
;
INSERT INTO @Table1
(Id, Message, Call, status, EMail, subject)
VALUES
(1, 'hi', 2222, 'Replied', 'g.m.p@m.com', 'Log a cll'),
(2, 'hello', 2222, 'Replied', 'g.m.p@m.com', 'Re:'),
(3, 'hi2', 2222, 'New', 'g.m.p@m.com', 'Re:log a cll'),
(4, 'hello2', 2223, 'Read', 'g.p@m.com', 'Log a cldf'),
(5, 'how r u', 2223, 'New', 'g.p@m.com', 'Re:Log a')
;
SELECT T.Id,
TT.Message,
TT.Call,
TT.status,
TT.EMail,
TT.subject
FROM @Table1 tt
LEFT OUTER JOIN
(
SELECT Id,
MAX(subject) OVER(PARTITION BY call ORDER BY call) subject,
MAX(Message) OVER(PARTITION BY call ORDER BY call) Message FROM @Table1)T
ON T.Id = TT.Id AND T.Message = TT.Message AND T.subject = TT.subject
WHERE T.id IS NOT NULL