2014-11-05 1 views
0

코드 :SQL 일 :에 IN을 켜고 대신 OR 문제

...and crset.Name IN (Select [part] from [dbo].[SplitString](@Type, ',')... 

@Type'Blue,White'하고 splitstring 기능 날에서 사용하는 목록에 해당 문자열을 설정 할 수 있습니다 가정합니다.

현재이 설정은 파란색 또는 흰색 인 모든 항목을 반환하며 집 색상을 가정합니다. 내가 원하는 것은 "색상이 목록에 있고 목록의 모든 색상을 가져야 만하는 집들입니다. 이것은 각 주택에 대해 여러 항목이 있음을 의미합니다. 그것은 "레드"와 "화이트"에 대한 항목이있는 주택은 나타나지 않고 "블루"에 대한 항목 만 나타나지 않고 "화이트"에 대한 항목은 나타나지 않을 것입니다. 여러 레코드 (파란색, 흰색)을 것이다.이있는 집은

당신이에서 작업에 더 많은 코드가 필요 알려줘.

답변

3

은 내가 CTE를 사용하여이 작업을 수행 할 것입니다 :

with vals as (
     Select part from [dbo].[SplitString](@Type, ',') 
    ) 
select t.house 
from table t 
where t.color in (select part from vals) 
group by t.house 
having count(distinct t.color) = (select distinct part from vals); 

당신이 정확한 색상에 일치하는 항목을 제한하려면

다음 where 절을 제거합니다.

+1

내부 조인이'in' 절보다 빠르지 않습니까? –

+0

하나의 작은 문제가 있습니다. "집계는 HAVING 절 또는 선택 목록에 포함 된 하위 쿼리에 있지 않으면 집계가 WHERE 절에 나타나지 않을 수 있으며 집계되는 열은 외부 참조입니다." 또는 집합에 포함 된 하위 쿼리에 있지 않으면 집계는 ON 절에 나타날 수 없습니다. HAVING 절 또는 select 목록을 포함하며 집계되는 열은 외부 참조입니다. 더 많은 코드가 필요합니까? – MetalPhoenix

+1

@ MetalPhoenix. . . 이 접근 방식을 따르기 위해 전체 쿼리를 다시 작성해야합니다. 'where' 절을 필터링하면 여러 행에 영향을 미치기 때문에 원하는 것을 할 수 없습니다. –

2
select house 
from crset 
where crset.Name IN (Select [part] from [dbo].[SplitString](@Type, ',')) 
group by house 
having count(distinct crset.Name) = (Select count([part]) from [dbo].[SplitString](@Type, ',')) 

많은 색상이있는 경우 당신은 house에 의해 그룹과 셀 수 당신의 목록에있는 것처럼 당신이 제공합니다. 그렇다면, 모든 t 그는 당신도 목록에있는 where 조건에서 필터링합니다.

+0

감사합니다. 나는 그것이 어디로 가고 있는지를 볼 수 있으며 티켓이 어떻게 될지를 보았습니다. 그러나 "새로운 쿼리에 넣을 때조차도 'Select'(등호 뒤에)의 잘못된 구문이 나타납니다. ? – MetalPhoenix

+1

답변을 업데이트했습니다. 선택 항목을 괄호 안에 넣어야합니다. –

+1

SQL을 상위 레벨로 설명하면 대답의 품질을 향상시킬 수 있습니다. –