代码之家  ›  专栏  ›  技术社区  ›  Anwar Chandra

从左侧外部联接中选择顶部联接

  •  6
  • Anwar Chandra  · 技术社区  · 15 年前

    伙计们,我有一个查询基本上选择了我们的用户使用的最新浏览器。

    这是我们的(简化)表格结构

    HITS_TABLE
    ----------
    USERID
    BROWSER
    HITSDATE
    
    USER_TABLE
    ----------
    USERID
    USERNAME
    

    下面是我如何查询用户使用的最新浏览器

    SELECT U.*, H.BROWSER
    
    FROM USER_TABLE U
    
    CROSS APPLY 
      (SELECT TOP 1 BROWSER 
       FROM HITS_TABLE 
       WHERE HITS_TABLE.USERID = U.USERID
       ORDER BY HITS_TABLE.HITSDATE DESC
      )as H
    

    hits_表是几天前添加的。

    所以,这个查询只是在我们添加了hits_表之后访问我们网站的结果用户,并消除了其他用户。

    这是样品箱

    USER_TABLE
    -------------------
    USERID     USERNAME
    -------------------
    1          'Spolski'
    2          'Atwoord
    3          'Dixon'
    
    
    HITS_TABLE
    ------------------------------
    USERID     HITSDATE     BROWSER
    ------------------------------
    2          15/8/2009    'Firefox 3.5'
    1          16/8/2009    'IE 6'
    2          16/8/2009    'Chrome'
    

    这是样品结果

    ------------------------------
    USERID     USERNAME     BROWSER
    ------------------------------
    1          'Spolsky'    'IE 6'
    2          'Atwoord'    'Chrome'
    

    但是,我想添加其他使用“未知”浏览器的用户。 这是我想要的结果

    ------------------------------
    USERID     USERNAME     BROWSER
    ------------------------------
    1          'Spolsky'    'IE 6'
    2          'Atwoord'    'Chrome'
    3          'Dixon'      'Unknown'
    

    我相信它可以通过左外联接来实现。 但我总是这样:(我不想要这个结果)

    ------------------------------
    USERID     USERNAME     BROWSER
    ------------------------------
    1          'Spolsky'    'IE 6'
    2          'Atwoord'    'Chrome'
    2          'Atwoord'    'Firefox 3.5'
    3          'Dixon'      'Unknown'
    

    我希望我的问题是清楚的。

    3 回复  |  直到 15 年前
        1
  •  7
  •   Robin    15 年前

    对hits_表使用group by on userid,可以获得每个userid的max()hitsdate。我在下面的代码中称这是最新的点击。

    在用户表上选择与最新点击的左连接,可以为每个用户提取记录。

    重新加入到点击表中,然后所有人都会让您提取与该日期相关联的浏览器记录,或者为没有记录的用户提取一个空值。

    select
       user_table.userid,
       user_table.username,
       isnull(hitstable.browser, 'unknown') as browser
    from
      user_table
    left join
    (
      select
        userid,
        max(hitsdate) hitsdate
      from
        hits_table
      group by  
        userid
    ) latest_hits
    on
      user_table.userid = latest_hits.userid    
    left join
      hits_table
    on hits.table.userid = latest_hits.userid
    and hits_table.hitsdate = latest_hits.hitsdate
    
        2
  •  3
  •   gbn    15 年前

    你不能再选吗?不是很漂亮,但是应该可以。

    SELECT U.*,
    
    ISNULL((SELECT TOP 1 BROWSER 
       FROM HITS_TABLE 
       WHERE HITS_TABLE.USERID = U.USERID
       ORDER BY HITS_TABLE.HITSDATE DESC),'UnKnown') AS Browser
    
    FROM USER_TABLE U
    
        3
  •  0
  •   Wael Dalloul    15 年前
    SELECT U.*,'BROWSER' = 
        case 
         when (SELECT TOP 1 BROWSER FROM HITS_TABLE WHERE HITS_TABLE.USERID = U.USERID ORDER BY HITS_TABLE.HITSDATE DESC) is  null then 'Unknown'
    else (SELECT TOP 1 BROWSER FROM HITS_TABLE WHERE HITS_TABLE.USERID = U.USERID ORDER BY HITS_TABLE.HITSDATE DESC)
        end
    FROM USER_TABLE U