2017-10-20 1 views
0

고유 ID에 대해 모든 코드 값이 651, 652, 655, 656이 아닌 레코드를 모두 선택하려면 어떻게합니까? 3 열열 값별 그룹을 제외시킬 쿼리 선택

ID Line Code 
1 1 651 
1 2 652 
1 3 655 
2 1 650 
2 2 652 
3 1 651 
3 2 655 
3 3 651 
3 4 658 
4 1 651 
4 2 651 

나는 모든 코드가

결과 데이터 세트가 아래처럼 될 것 인 ID에 대한 651/652/655/656 중 하나 인 모든 레코드를 검색 할과

소스 테이블

ID Line Code 
2 1 650 
2 2 652 
3 1 651 
3 2 655 
3 3 651 
3 4 658 

답변

2

이 시도 :

SELECT t1.* 
FROM table1 as t1 
INNER JOIN 
(
    SELECT DISTINCT ID 
    FROM table1 AS t1 
    LEFT JOIN 
    (
    SELECT 651 AS code UNION SELECT 652 UNION 
    SELECT 655 UNION SELECT 656 
) AS t2 ON t1.code = t2.code 
    WHERE t2.code is NULL 
) AS t2 ON t1.id = t2.id; 

demo * (MySQL 용 데모하지만 여전히 SQL 서버 2005 같은)

| ID | Line | Code | 
|----|------|------| 
| 2 | 1 | 650 | 
| 2 | 2 | 652 | 
| 3 | 1 | 651 | 
| 3 | 2 | 655 | 
| 3 | 3 | 651 | 
| 3 | 4 | 658 | 
+0

@ RasmusDybkjær - 감사합니다. 제 대답을 편집했습니다. –

+0

@ RasmusDybkjær'IN()'이 2005 년에 확실히 제공되었습니다 ... –

+0

하위 쿼리의 조건부 집계가 다른 옵션이 될 수 있습니다. – Matt

0

광고 항목이에 대한 그 값을하지 않는 코드가 존재 어디 있는지 확인합니다. 하위 쿼리를 통해이 작업을 수행 할 수 있습니다. 예 :

DECLARE @temp TABLE (ID int, Line int, Code int) 
INSERT INTO @temp VALUES 
(1, 1, 651),(1, 2, 652),(1, 3, 655),(2, 1, 650),(2, 2, 652),(3, 1, 651) 
,(3, 2, 655),(3, 3, 651),(3, 4, 658),(4, 1, 651),(4, 2, 651) 

SELECT ID, Line, Code 
    FROM @temp T1 
WHERE EXISTS (SELECT * 
       FROM @temp T2 
       WHERE T2.ID = T1.ID 
        AND T2.Code NOT IN (651, 652, 655, 656) 
      ) 
0

여기에 IN 또는 Exists를 사용하지 않는 방법이 있습니다. 하위 쿼리에서 조건부 집계를 사용하여 ID별로 원하지 않는 코드보다 많은 레코드가 있는지 확인한 다음 원래 테이블로 다시 조인하여 세부 정보를 얻습니다.

DECLARE @Table AS TABLE (ID int, Line INT, Code INT) 

INSERT INTO @Table (ID, Line, Code) 
VALUES (1, 1, 651),(1, 2, 652),(1, 3, 655),(2, 1, 650),(2, 2, 652) 
     ,(3, 1, 651),(3, 2, 655),(3, 3, 651),(3, 4, 658),(4, 1, 651) 
     ,(4, 2, 651) 

SELECT t1.* 
FROM 
    @Table t1 
    INNER JOIN (
     SELECT 
      ID 
     FROM 
      @Table 
     GROUP BY 
      ID 
     HAVING 
      COUNT(*) > COUNT(CASE WHEN Code = 651 OR Code = 652 OR Code = 655 OR Code = 656 THEN Code END)) t2 
    ON t1.ID = t2.ID