从左外连接中选择顶部一个

时间:2009-08-16 08:35:52

标签: sql-server-2005 outer-join

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

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

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_TABLE。

因此,该查询只是在我们添加HITS_TABLE后访问我们网站的结果,并消除了其他用户。

以下是示例案例

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'

我相信它可以通过LEFT OUTER JOIN来实现。 但我总是这样:(我不想要这个结果)

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

我希望我的问题很明确。

3 个答案:

答案 0 :(得分:7)

在hid_table上使用on userid上的group by允许你获得每个userid的max()hitsdate。我在下面的代码中称这个最新的命中。

在USER TABLE上选择左连接到LATEST HITS允许您为每个用户提取记录。

加入HITS TABLE,然后全部用来拉取与该日期相关联的浏览器记录,或者为那些没有记录的用户提供null。

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

答案 1 :(得分:3)

你不能选择,不漂亮,但应该工作..

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

答案 2 :(得分:0)

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