2012-11-01 29 views
0

我有2個表:user和licenseduser。第一個包含全部用戶,第二個僅包含具有許可證的用戶(2列:useruid和subscriptionid)。SQL如何從左連接提取謂詞

鑑於subscriptionId我必須顯示在網格所有用戶和一個布爾標誌列爲每個用戶指示他/她是否有訂閱。

實施例:下面的查詢給出了我,對於subscriptionId = 7

select firstname, lastname, emailaddress, subscriptionid 
from dbo.[user] 
left join (select * from dbo.licensedUser where subscriptionid = 7) lu on dbo.[user].[Uid] = lu.useruid 

然而,由於執行程序使用ORM這個查詢是不適合我有用。我想創建的視圖(稱爲MyView的),使得我可以(或ORM可以)做到這一點:

選擇名字,姓氏,EMAILADDRESS,subscriptionid
從MyView的 其中subscriptionid = 7或subscriptionid爲null

請問你能幫我嗎? 預先感謝您。在ORM

SELECT firstname, lastname, emailaddress, subscribed 
FROM v_user_subscription 
WHERE subscriptionId = 7 

+0

'subscriptionId'是某種訂閱表的外鍵嗎? – Quassnoi

回答

1

如果你有訂閱的表,你可以使用這個:

CREATE VIEW 
     v_user_subscription 
SELECT u.*, s.subscriptionId, lu.subscriptionId AS subscribed 
FROM user u 
CROSS JOIN 
     subscription s 
LEFT JOIN 
     licensedUser lu 
ON  lu.userId = u.uid 
     AND lu.subscriptionId = s.subscriptionId 

,並使用它。

你不想從這個視圖中選擇,沒有過濾,因爲它可能會很大,但是,subscriptionIdSQL Server上的過濾器將展開視圖,而不會實際瀏覽其他訂閱。

+0

這正是我所期待的。你是對的,我總是會從這個視圖中選擇一個特定subscriptionId的過濾器。 爲了提高查詢性能,我可以做些額外的事情嗎? 謝謝! – lontivero

+0

@lontivero:只要確保你在'licensedUser(uid,subscriptionId)'上有'UNIQUE'索引(或'PRIMARY KEY')。 – Quassnoi

+0

+1我想過這個交叉連接解決方​​案,但決定去簡單加入:) –