2011-06-09 109 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