If you are using sql 2005 or newer, you can use the
EXCEPT
运算符查找包含所有必需类别的新闻项。或者更准确地说,查找在新闻项类别名称集合中未找到的类别列表中没有名称的新闻项。
select NI.NewsID, NI.Post
from NewsItem NI
where (@pCategories = '' or
NOT EXISTS (select EntityNameColumn FROM BuildStringTable(@pCategories)
EXCEPT
Select CategoryName FROM NewsItem ni
join NewsItemCategories nic ON ni.NewsID=nic.NewsID
join Category c ON c.CategoryID = nic.CategoryID
WHERE ni.NewsID=NI.NewsID))
To do this without the EXCEPT operator looks like this:
where (@pCategories = '' or
NOT EXISTS (select EntityNameColumn FROM BuildStringTable(@pCategories) ct
LEFT OUTER JOIN
(Select CategoryName FROM NewsItem ni
join NewsItemCategories nic ON ni.NewsID=nic.NewsID
join Category c ON c.CategoryID = nic.CategoryID
WHERE ni.NewsID=NI.NewsID) nicn
WHERE nicn.CategoryName IS NULL)