2012-03-28 4 views
0

내가 같은 테이블이 있습니다 당신이 볼 수 있듯이복잡한 SQL 쿼리 : 동일한 테이블 내의 두 쿼리?

ID |  LABEL  | SOME_VALUE 
1   a    rand_1 
2   a    NULL 
3   b    rand_9 
4   c    rand_3 
5   c    rand_3 
6   c    rand_3 
7   d    NULL 
8   d    rand_4 

을, ID 라벨이 고유하지 고유 (1 이상 가능) 및 some_value은 고유하지 않습니다.

내가하고 싶은 것은 다음

내가 하나 이상의 행 (최소 2) 어느 행이 NULL이 SOME_VALUE을 가지고있는 데이터베이스에있는 라벨의 고유 목록을 얻을 싶어요.

그래서 내가 얻을 것이다 :

ID |  LABEL  | SOME_VALUE 
1   a   rand_1 
2   a   NULL 
7   d   NULL 
8   d   rand_4 

을 대가로.

내가 어떻게 이것을 달성 할 수 있습니까?

+0

왜 ID 4, 5 및 6을 제외 시켰습니까? 레이블 그룹 내에서'SOME_VALUE'에 대해 DISTINCT 값을 두 개 이상 원하기 때문입니까? – nnichols

+0

안녕하세요! 4-5-6에는 label과 some_value가 모두 중복되어 있기 때문입니다. some_value가있는 레이블을 찾고 some_value를 사용하지 않고 다른 행에서 동일한 레이블을 만들 수 있지만 먼저 어떤 레이블인지 확인하고 싶습니다. – Phil

답변

2

는 두 가지 버전이 있습니다. 첫 번째 결과는 rand_3을 제거한 결과와 정확히 일치합니다. 세 번 모두 모든 값이 같아도 (문제의 특정 조건이 표시되지 않음) rand_3이 제거 되었기 때문입니다. some_value하지 인 (나는 또한 요구 사항 다음

select * 
from tbl 
inner join 
(
    select label 
    FROM tbl 
    GROUP BY Label 
    HAVING count (distinct some_value) 
     + sum(distinct case when some_value is null then 1 else 0 end) > 1 
) a 
on tbl.label = a.label 

두 번째는 C를 검색하는 바보 :-)이

더 나은 방법이 있어야합니다,하지만 그들은 말대로 나는 뇌 오늘 할 수 없습니다 some_value 중 적어도 하나에 대해 null).

select * 
from tbl 
inner join 
(
    select label 
    FROM tbl 
    GROUP BY Label 
    HAVING count(*) > 1 and count(some_value) > 0 
) a 
on tbl.label = a.label 

And there is Sql Fiddle.

2

HAVING 매개 변수 제한 분류 항목 :

SELECT 
    Label 
FROM dbo.TableName 
WHERE NOT Some_Value IS NULL 
GROUP BY Label 
HAVING COUNT(*) > 2 
+0

'where SOME_VALUE is not NULL' 그룹 이전에 –

1
SELECT t1.* 
FROM yourTable t1 
JOIN yourTable t2 
ON t1.LABEL = t2.LABEL 
AND t1.ID < t2.ID 
WHERE t1.SOME_VALUE IS NOT NULL 
OR t2.SOME_VALUE IS NOT NULL 
1

이 작동합니다 -

SELECT test.* 
FROM (
    SELECT label 
    FROM test 
    GROUP BY Label 
    HAVING COUNT(DISTINCT IFNULL(some_value, '~null~')) > 1 
) AS tmp 
INNER JOIN test 
    ON tmp.label = test.label; 
+0

같은 해결책을 찾고 있었지만, some_value에 'null'값이 포함되어있어 히트에 빠져 있어야했기 때문에 포기했습니다. 가능성은 극도로 낮다는 것을 알고 있습니다. –

+0

저는이 문자열을 'null'문자열로 변환하여 NULL을 올바르게 처리한다고 확신합니다. 그것은 내가 시도한 모든 경우에 적용됩니다. – nnichols

+1

레이블 'a'의 한 행에 some_value에 'null'(아포스트로피)을 넣고 다른 행에 NULL을 넣는 경우를 제외하고는. 'count (distinct) '는 그것들을 하나로서 보게 될 것입니다. 다시 말하지만, 이것은 매우 희귀 한 것처럼 보입니다. –