2016-11-08 1 views
1

쿼리의 WHERE 절에 사용될 결과 집합을 나타 내기 위해 변수를 사용하고 싶습니다.하위 연산자를 IN 연산자 내에서 사용할 변수로 설정

SELECT * 
FROM Table1 
WHERE 
    Exam1_ID IN (SELECT Id FROM Exam) 
    OR Exam2_ID IN (SELECT Id FROM Exam) 
    OR Exam3_ID IN (SELECT Id FROM Exam) 
    OR Exam4_ID IN (SELECT Id FROM Exam) 

나는 그래서 쿼리를 계속 반복 할 필요는 없습니다 SELECT Id FROM Exam 대신에 변수를 사용하고 싶습니다. 변수 선언을 시도했지만 서브 쿼리의 결과에 여러 정수가 포함될 수 있으므로 변수를 선언하는 것이 확실하지 않습니다. 나는

DECLARE @SubQuery INT; 
SET @SubQuery = (SELECT Id FROM Exam); 

SELECT * 
FROM Table1 
WHERE 
    Exam1_ID IN (@SubQuery) 
    OR Exam2_ID IN (@SubQuery) 
    OR Exam3_ID IN (@SubQuery) 
    OR Exam4_ID IN (@SubQuery) 

나는 다음과 같은 오류가 발생했습니다 ... 나서서 시도 ..

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

+0

변수를 단일 값 대신 테이블로 선언 했습니까? –

+0

변수를 INT로 선언했는데 문자 그대로 * an * (단수) int이므로 하나 이상의 값을 가질 수 없습니다. 당신이하고 싶은 것을하기 위해서, 당신은 값을'varchar'에 연결하고, 동적 인 SQL을 사용할 수 있습니다 (Rich Benner의 솔루션처럼 더 간단한 해결책이 있습니다). – HoneyBadger

답변

2

이와 같은 것을 작성할 수 있습니다.

 SELECT * 
     FROM Table1 t1 
     WHERE EXISTS ( 
     SELECT 1 FROM Exam e 
     WHERE e.Id in (t1.Exam1_ID , t1.Exam2_ID , t1.Exam3_ID, t1.Exam4_ID) 
     ) 
3

을 당신은 아마 이것이 WHERE EXISTS이 같은

SELECT * 
FROM Table1 t1 
WHERE EXISTS ( SELECT * 
       FROM Exam e 
       WHERE t1.Exam1_ID = e.Id 
       OR t1.Exam2_ID = e.Id 
       OR t1.Exam3_ID = e.Id 
       OR t1.Exam4_ID = e.Id) 
를 사용하여 실적이 더 좋은 것
+2

그리고'WHERE e.Id IN (Exam1_ID, Exam2_ID, ...) '로 더 예뻐졌습니다. – jarlh

1

오류 메시지가 하위 쿼리는 1 개 이상의 값을 반환

에서 시작 할 수 있습니다. 하위 쿼리가 =,! =, <, < =,>,> = 또는 하위 쿼리가 표현으로 사용되는 경우에는 허용되지 않습니다.

이유

은 아주 간단합니다, 당신은 당신이 TABLE(Id INT)로 변경합니다 그래서 만약 당신이 새로운 오류 메시지가 표시됩니다 subquery INT으로 선언했다.

다양한 방법으로 문제를 해결할 수 있습니다.

1) 내부에 가입 (당신이 리치 베너 응답 샘플을 찾아주세요))

DECLARE @SubQuery TABLE (RecordId INT) 

INSERT INTO 
    @SubQuery 
SELECT 
    Id 
FROM 
    Exam 

SELECT * 
FROM 
    Table1 t1 
INNER JOIN @Subquery sq 
    ON sq.Id = t1.Exam1_ID 
    OR sq.Id = t1.Exam2_ID 
    OR sq.Id = t1.Exam3_ID 
    OR sq.Id = t1.Exam4_ID 

2이 방법을 사용

을 존재하는 유효하고 당신에게 중복을 제공 할 수 있습니다, 그래서 난 몰라 . 그는 타이핑하는 동안 그것을 올렸다. 하지만 거기에 하나의 오타가 있습니다. 존재 블록에 다른 별칭을 사용했습니다.

OR t1.Exam2_ID = e.Id --t1 - correct alias 
OR t2.Exam2_ID = e.Id --t2 - incorrect 
OR t3.Exam2_ID = e.Id --t3 - incorrect 
OR t4.Exam2_ID = e.Id --t4 - incorrect 
+0

오타를 지적 해 주셔서 고마워요. upvote가 :) –