我有以下表格:
User 1:n UserFilter n:1 Filter
Filter
获得了ID
和Name
,User
获得了Name
ID
(不要怪我,不是我的想法!)。
整个“用户''得到了过滤器1,2和3”-Idea用于ASP前端,对问题不重要。
UserFilter
只有两列,User
和FilterID
,所以如果有一个用户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。
有什么想法吗?
谢谢!
答案 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