Оставлено внешнее Соединение SQL Server Проблема - не возвращается достаточно строк - PullRequest
1 голос
/ 09 июня 2011

У меня есть следующие таблицы:

User 1:n UserFilter n:1 Filter

Filter получил ID и Name, User получил свой Name как ID (не вините меня, не моя идея!).

Весь пользователь "a" получил Фильтры 1, 2 и 3 "- идея используется в интерфейсе ASP, что не важно для вопроса.

UserFilter просто получил 2 столбца, User и FilterID, поэтому, если есть столбец Пользователь a - Фильтр 1, это означает, что Пользователь a использует Фильтр 1, если такого столбца нет, значит, он не .

Теперь я хотел бы выполнить запрос SELECT, который возвращает каждый фильтр (всего их 8) для определенного пользователя с пользовательским столбцом с именем active.

Вот что я получил до сих пор:

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 ]

5 голосов
/ 09 июня 2011

Условие 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 голос
/ 09 июня 2011

Корина ответ правильный. Вот еще один способ выразить то же самое (просто показать вам другой способ написать тот же запрос):

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
1 голос
/ 09 июня 2011

У вас есть предложение 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
...