2010-06-26 5 views
1

문제 내가 NewsItem의 목록을 선택하기 위해 저장 프로 시저를 작성하는 것을 시도하고있다선택 기록

NewsItem에가있는 카테고리을 모두 가지고 기록 목록에. 목록이 비어 있으면 모든 뉴스 항목을 반환합니다.

NewsItem  NewsItemCategories  Category 
--------  ------------------  -------- 
NewsID  NewsID     CategoryID 
Post   CategoryID    CategoryName 

쉼표로 구분 된 범주 이름 목록을 저장 프로 시저에 전달하고이 범주의 테이블을 반환하는 함수를 만들었습니다.

exec sp_GetNewsItems 'sport,football,hockey' 

EntityNameColumn - table returned from my function BuildStringTable 
---------------- 
sport 
finance 
history 

내가 봤어 무엇

select NI.NewsID, NI.Post 
from NewsItem NI 
where (@pCategories = '' or 
    (select COUNT(*) 
    from NewsItemCategories NIC 
    inner join Category C on NIC.CategoryID = C.CategoryID 
    inner join BuildStringTable(@pCategories) CT on C.CategoryName = CT.EntityNameColumn 
where NIC.NewsID = NI.NewsID) > 0) 

질문이 여러 카테고리의 이름을 통과 할 때 그러나 작동하지 않습니다 당신이 그것을 하나의 카테고리 이름을 전달하면 쿼리가 작동

. 위의 예제 쿼리에서, 적어도 이상을 포함하는 NewsItems를 반환해야합니다. 카테고리 스포츠, 축구, 하키.

답변

1

SQL 2005 이상을 사용하는 경우 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)) 

연산자를 제외하지 않고이 작업을 수행하려면 다음과 같습니다 :

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)