2017-11-02 7 views
1

나는 직원 쿼리 목록에서 SELECT 인 일반 쿼리를 설정했습니다. 내 매개 변수가 searchType = 'omit 인 경우 임시 테이블에 있는지 확인하여 해당 검색에 사람들이 표시되지 않도록하지 않을 것입니다. 위의 예에서 WHERE 절의 SQL Case 문을 사용하여 데이터를 생략하십시오.

-- Params 
@searchType varchar(10) 

-- Temp Table 
DECLARE @omit AS TABLE (userID INT) 
INSERT INTO @omit(userID) VALUES (123) 
INSERT INTO @omit(userID) VALUES (456) 
INSERT INTO @omit(userID) VALUES (789) 

-- Query 
SELECT * 
FROM Employees 
WHERE userID NOT IN( 
    CASE 
     WHEN @searchType = 'omit' 
      THEN (SELECT userID FROM @omit) 
      ELSE '' 
     END 
) 

, 내가 절차를 실행하고 내 PARAM으로 omit을 통과하면, 그것은 그들의 userID는 임시 테이블에 존재하지 않는 모든 직원을 선택합니다.

이 시도하면 Subquery returned more than 1 value 오류가 발생합니다.

이것을 설정하는 가장 좋은 방법은 무엇입니까?

SELECT e.* 
FROM dbo.Employees e 
LEFT JOIN @omit o 
    ON e.userID = o.userID 
WHERE NOT (@searchType = 'omit' AND o.userID IS NOT NULL); 
+1

'SELECT userID FROM @ omit' 쿼리는 1 행 이상을 반환하므로 대신 'NOT EXISTS'를 사용하는 것이 좋습니다. – Sami

답변

0

이 당신이 원하는 무엇을해야합니까? 왼쪽 외부 조인

SELECT e.* 
FROM dbo.Employees e 
LEFT OUTER JOIN @omit o 
    ON e.userID = o.userID 
WHERE 
    (@searchType = 'omit' AND o.userID IS NULL) 
    OR 
    (@searchType != 'omit') 

오른쪽 (생략) 일치하는에 조인 (직원)의 왼쪽 만 기록에 테이블의 모든 레코드를 제공합니다. 즉, 매개 변수가 '생략'일 때는 생략 표에 행을 포함 할 수 없으므로 다른 점은 중요하지 않습니다.

1

그래서 당신은 단지 당신이 그 매개 변수를 전달하는 경우 필터링 할 :

0

당신은

SELECT * FROM Employees a WHERE not exists (SELECT 1 FROM @omit b 
where a.userID = B.userID AND @searchType = 'omit') 
0

즐겨 찾기를 시도하고 ERLAND의 사이트를 읽을 수 있습니다. 시간이있을 때 그 모든 것. 관련 부분은 dynamic search conditions입니다. 그리고 게시하기 전에 인터넷 검색에 대해 생각해보십시오. 자주 묻는 주제이기 때문에.

또한 "저장 프로 시저"에 태그를 지정했지만 모든 코드를 포함하지는 않았습니다. 위험 요소는 코드를 생략한다는 것입니다. 아무도 데이터 유형, 가정 또는 프로 시저와의 인터페이스를 볼 수 없다는 것입니다. 일반적으로 주어진 쿼리를 만들기 위해 시도하는 "일반"이 많을수록 성능이 떨어집니다. Erland는 검색 로직의 가변성을 다루는 여러 가지 방법 외에도이를 논의합니다.