2016-03-02 124 views
0

我有一个表像如何为此SQL查询编写左外连接?

ParsereplyId Message Callid status EMailid  subject 

------------------------------------------------------------------------ 
     1  hi   2222 Replied [email protected] Log a cll 
     2  hello  2222 Replied [email protected] Re: 
     3  hi2  2222 New  [email protected] Re:log a cll 
     4  hello2  2223 Read  [email protected]  Log a cldf 
     5  how r u 2223 New  [email protected]  Re:Log a 

从上面的表格我想下面的输出:

ParsereplyId Message Callid status EMailid  subject 

------------------------------------------------------------------- 
     3  hi2  2222 New  [email protected] Re:log a cll 
     5  how r u 2223 New  [email protected]  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表包含​​3210,基于电子邮件ID从两个表中我能得到该邮件的用户名。

编辑2: 我可以使用左外连接,而不是使用内部联接像

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个条件这是不是在查询中使用的正确方式。它使我的代码变得丑陋。所以我要求你帮忙解决这个问题。

+0

你知道你错过了'INNER'和'JOIN'权之间的空间修饰的查询? – Coderchu

+0

正确地给出表格的详细信息... – Avi

+0

我假设这是您正在使用的SQL Server,是否正确?你想为每个CallID组使用ParsedReplyID最高的记录吗?如果是这样,你可以从内部联接中选择*从表名中选择*(选择max(parsedreplyid)作为mp,callid从表名组中通过callid)b对a.parsedreplyid = b.mp' – zedfoxus

回答

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', '[email protected]', 'Log a cll'), 
     (2, 'hello', 2222, 'Replied', '[email protected]', 'Re:'), 
     (3, 'hi2', 2222, 'New', '[email protected]', 'Re:log a cll'), 
     (4, 'hello2', 2223, 'Read', '[email protected]', 'Log a cldf'), 
     (5, 'how r u', 2223, 'New', '[email protected]', '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 
+0

我们不能用简单的'ROW_NUMBER'实现这个吗 –

+0

@ mohan111:你的查询很有用,但我明确表示我想在左边的外部实现它加入,而不是在内部加入。无论如何抱歉没有及时回复。 – Gomathipriya

+0

是的,我们可以在简单的row_number中做,但两者都会达到相同的目的,因为分区将通过调用列来完成@MotoGP – mohan111