2012-05-25 2 views
2

3 열이있는 테이블이 있습니다 : id, val1val2입니다.여러 개의 고유 한 열 값 조합이있는 행 선택

각 고유 값 val2에 대해 복수 개의 고유 값 val1이있는 모든 행을 선택하고 싶습니다.

예 :

| id | val1 | val2 | 
|------------------| 
| 1 | A1 | a2 | 
| 2 | A1 | a2 | 
| 3 | A1 | b2 | 
| 4 | B1 | b2 | 
| 5 | A1 | c2 | 
| 6 | A1 | c2 | 
| 7 | A1 | c2 | 
| 8 | A1 | d2 | 
| 9 | C1 | d2 | 
| 10 | A1 | d2 | 

원하는 결과 :

| id | val1 | val2 | 
|------------------| 
| 3 | A1 | b2 | 
| 4 | B1 | b2 | 
| 8 | A1 | d2 | 
| 9 | C1 | d2 | 
| 10 | A1 | d2 | 

나는 내가이 작업을 수행 할 수있는 쿼리를 마련하지 못했다, 다른 어쩌면 사람이 해결하는 방법에 대한 아이디어가있다 이.

+0

어떤 DB 시스템을? MSSQL 2005/08/12, MySQL ... – Paddy

+0

@Paddy : Postgres 9.1 – smerlin

+0

행 8과 10은 ID 번호를 제외하고는 동일합니다. 나는 왜 당신이 8과 10을 포함 시킬지 이해하지 못한다. 그러나 1과 2는 배제한다. 그것도 ID 번호를 제외하고 동일하다. –

답변

2

을, 당신은 또한이 같이 할 수있는 :

SELECT 
    id, 
    val1, 
    val2 
FROM (
    SELECT 
    *, 
    MIN(val1) OVER (PARTITION BY val2) AS minval1, 
    MAX(val1) OVER (PARTITION BY val2) AS maxval1 
    FROM atable 
) s 
WHERE minval1 <> maxval1 
+0

을 참조하십시오. 쿼리가 거의 두 배 빠릅니다. 더 읽기 쉽습니다. – smerlin

2
SELECT * 
FROM TABLE_2 
WHERE EXISTS (SELECT 1 
       FROM (SELECT val2, 
           val1, 
           Count(*) AS Number 
         FROM TABLE_2 
         GROUP BY val2, 
           val1 
         HAVING Count(*) = 1) a 
       WHERE TABLE_2.val2 = a.val2) 
ORDER BY ID 
+1

이것은 행 3 및 4를 반환합니다. http://sqlfiddle.com/#!3/44422/37 – Paddy

+0

@Romil : 예, 이제 작동합니다. Andomars 쿼리가 모두 정확하기 때문에 어떤 테이블이 더 큰 성능을 내는지 확인할 것입니다.) – smerlin

6

당신은 val1 개 이상의 서로 다른 값으로 val2를 검색 할 having 절을 사용할 수 있습니다. 예를 들어 :

select yt.* 
from YourTable yt 
join (
     select val2 
     from YourTable 
     group by 
       val2 
     having count(distinct val1) > 1 
     ) as filter 
on  yt.val2 = filter.val2 
+0

예제를 실행하고 올바른 결과를 반환했습니다. – smerlin

+1

@aF : 예제 결과와 일치합니다. Paddy의 [SQLFIddle] (http://sqlfiddle.com/#!3/0dc5e/1) – Andomar

2

이 쿼리 시도해보십시오 집계 윈도우 함수를 사용하여

SELECT * from tbl where val2 in (SELECT val2 FROM `tbl` group by val2 having 
count(distinct(val1)) > 1)