【问题标题】:How to Write Left Outer join for this SQL query?如何为此 SQL 查询编写左外连接?
【发布时间】:2016-06-14 19:02:06
【问题描述】:

我有一张这样的桌子

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 

从上表我想得到以下输出:

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 

我尝试了以下查询。 但我想在左外连接中做到这一点

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查询到inner join??

编辑:我更正了我上面的错误

UM_USer 表包含username, emailid,基于两个表中的电子邮件 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 条件,这不是在查询中使用的正确方法。它使我的代码难看。所以我请你帮忙解决这个问题。

【问题讨论】:

  • 您知道您在INNERJOIN 之间缺少一个空格,对吗?
  • 正确给出表格的详细信息...
  • 我假设这是您正在使用的 SQL Server,对吗?您想要每个 CallID 组的 ParsedReplyID 最高的记录吗?如果是这样,你可以这样做select * from tablename a inner join (select max(parsedreplyid) as mp, callid from tablename group by callid) b on a.parsedreplyid = b.mp
  • @zedfoxus:我想要的确切输出由先前的评论给出。现在我想在左外连接中做到这一点。
  • @Gomathipriya 您能看到下面的查询将帮助您获得所需的输出

标签: sql sql-server rdbms


【解决方案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 

【讨论】:

  • 我们不能用简单的ROW_NUMBER 实现来做到这一点
  • @mohan111:您的查询很有用,但我明确表示我想在左外连接中实现它,而不是在内连接中。无论如何,很抱歉没有及早回复。
  • 是的,我们可以用简单的 row_number 来做,但两者的目的相同,因为分区将通过调用列 @MotoGP 来完成
  • 为什么你迫切需要左外连接@Gomathipriya你能详细说明一下吗?
  • 这是我们在组织中使用的标准
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 2021-01-15
  • 2016-02-19
相关资源
最近更新 更多