左外连接SQL Server问题 - 没有返回足够的行

时间:2011-06-09 11:34:08

标签: sql sql-server left-join

我有以下表格:

User 1:n UserFilter n:1 Filter

Filter获得了IDNameUser获得了Name ID(不要怪我,不是我的想法!)。

整个“用户''得到了过滤器1,2和3”-Idea用于ASP前端,对问题不重要。

UserFilter只有两列,UserFilterID,所以如果有一个用户a - 过滤器1列,则表示用户a正在使用过滤器1,如果没有这样的话专栏,这意味着他不是。

现在,我想执行一个SELECT查询,该查询返回具有名为active的自定义列的特定用户的每个过滤器(总共8个)。

这是我到目前为止所得到的:

select 
    distinct f.Name, f.Type, 
    case when uf.userid = 'a' then 1 else 0 end as Active 
from filter f 
left outer join userfilter uf on f.id = uf.filterid
where uf.userid = 'a' or uf.userid is null

这将返回8列,其中一些包含Active = 0,一些包含Active = 1,正如我所希望的那样,但如果UserFilter包含多个用户的过滤器,例如

a - 1
a - 2
b - 3
b - 7
a - 8

我运行此查询的用户“a”查询将只返回过滤器1作为活动,2作为活动,4 5和6作为非活动,8作为活动,完全省略3和7。

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:5)

userid ='a'的条件应该是连接条件:

select 
    distinct f.Name, f.Type, 
    case when uf.userid = 'a' then 1 else 0 end as Active 
from filter f 
    left outer join userfilter uf on f.id = uf.filterid and uf.userid = 'a'

答案 1 :(得分:1)

你有一个where子句,只包含uf.userid ='a'或null

的行

尝试:

 select distinct f.Name,f.Type, case when uf.userid is null then 0 else 1 end as Active 
 from filter f left outer join userfilter uf on f.id = uf.filterid

答案 2 :(得分:1)

Corina的回答是正确的。这是表达相同事物的另一种方式(只是为了向您展示编写相同查询的不同方式):

select 
    Filter.Name, Filter.[Type],  
    case when x.UserId IS NULL then 0 else 1 end as Active
from 
    Filter
left join
(
    select 
        *
    from 
        UserFilter
    where
        UserFilter.UserId = 'a'
) x
on
    Filter.Id = x.FilterId