2011-06-09 102 views
1

我有以下表格:左外连接SQL Server的问题 - 没有返回足够的行

User 1:n UserFilter n:1 Filter 

Filter得到了一个IDNameUser得到了他NameID(不要怪我,不是我的想法!)。

整个“User'a'过滤器1,2和3”-Idea被用于ASP前端,对于这个问题并不重要。

UserFilter简直是2列,UserFilterID,所以如果有一列用户 - 过滤器1,这意味着用户正在使用过滤器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

有没有想法?

谢谢!

回答

5

,条件是用户ID = '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' 
+0

伟大的,这一个适用于当前案件和所有其他案件(没有其他用户,其他用户有相同的过滤器,其他用户有不同的过滤器,当前用户得到0过滤器等)! – 2011-06-09 12:31:30

1

你有一个where子句仅包括行,其中uf.userid = 'A' 或空

尝试:

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 
+0

是的,那是迄今为止工作的逻辑,我现在应该做什么? – 2011-06-09 11:38:43

+0

如果我只是删除where子句,我将收到数据集“User:B,Filter:3,Active:0”给我基本上正确的信息,但我想接收用户:NULL而不是B. – 2011-06-09 11:42:00

+0

请参阅我的编辑 – BonyT 2011-06-09 11:54:06

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