自己加入相同的表格

时间:2013-09-17 20:05:40

标签: sql sql-server-2000 user-agent

我的一个表存储了用户浏览器中的UserAgent以及与之关联的相应UID以及其他一些数据。每次用户登录时都会发生这种情况。因此,每个用户将拥有许多条目。我试图查询此表,以根据质量找到一些独特的用户。

例如,我试图找到只使用过IE6且没有其他浏览器的用户。我到目前为止最接近的是通过这种方法:

select distinct (U.UID) from TABLE1 tb1
inner join TABLE1 tb2 on tb1.UID = tb2.UID
where tb1.UserAgent like '%MSIE 6.%'
and tb2.UserAgent like '%MSIE 6.%'

这似乎回复了使用IE6和任何其他浏览器的用户。我试图发现基本上与此相反。仅使用IE6和IE6的用户。我也尝试了下面的那个但是也没有用,因为这个用户的很大一部分有非IE6浏览器的其他条目。

select distinct (U.UID) from TABLE1 tb1
inner join TABLE1 tb2 on tb1.UID = tb2.UID
where tb1.UserAgent like '%MSIE 6.%'
and tb2.UserAgent not like '%MSIE 6.%'

我认为我走在正确的轨道上,但可能会离开这里。

TIA!

3 个答案:

答案 0 :(得分:1)

选择没有任何其他用户代理的用户代理like '%MSIE 6.%'的用户。内部查询返回未使用'%MSIE 6.%'

的用户
select distinct tb1.UID from TABLE1 tb1
where tb1.UserAgent like '%MSIE 6.%' and
      NOT EXISTS ( select tb2.UID from TABLE1 tb2
                   where tb1.UID = tb2.UID AND 
                         tb2.UserAgent not like '%MSIE 6.%' )

您甚至可以使用NOT IN代替NOT EXISTS tb1.UID NOT IN (...)。{/ p>

select distinct tb1.UID from TABLE1 tb1
where tb1.UserAgent like '%MSIE 6.%' and
      tb1.UID NOT IN ( select tb2.UID from TABLE1 tb2
                       where tb2.UserAgent not like '%MSIE 6.%' )

where子句条件tb1.UserAgent like '%MSIE 6.%' and也可以在没有任何副作用的情况下被删除,因为NOT和内部查询确保用户的代理匹配%MSIE 6.%

答案 1 :(得分:1)

select distinct (tb1.UID) from TABLE1  tb1
where not exists (
                   select 1 
                   from TABLE1 
                   where UID = tb1.UID and UserAgent not like '%MSIE 6.%'
                 )

答案 2 :(得分:0)

无需加入,比JOIN / NOT EXISTS快得多:

select UID 
from TABLE1
group by UID
having max(case when UserAgent like '%MSIE 6.%' then 0 else 1 end) = 0