2010-02-05 10 views
2

이 테이블쿼리에 대한 도움이 필요하십니까?

NAME|VALUE| 
T | A 
T | NONE 
T | B 
S | NONE 

여기서 NONE 값은 실제 NULL 값입니다.


모든 줄을 반환하는 쿼리를 수행해야하지만 th 이름의 값이 인 경우 위의 테이블에 대한 결과에서 다음과 같은 값을 가진 행만 반환해야합니다.

NAME|VALUE| 
T | A 
T | B 
S | NONE 

그런 쿼리를하는 것을 알고 있습니까?

미리 도움을 주셔서 감사합니다.

+0

이름 당 최대 2 개의 행이 있습니까? 값이있는 이름 당 최대 한 행이 있습니까? 그렇지 않다면 어느 값을 돌려주고 싶습니까? –

+0

(T, A), (T, A)와 같은 반복되는 이름 값 쌍이있을 수 있습니까? 아니면 고유 한 제약 조건이 있습니까? –

답변

1

최대 두 개의 값이 있습니까? 즉, 단일 값 "NONE"또는 각 값 중 하나만 가져올 수 있습니다. 그렇다면, 당신은이 작업을 수행 할 수 있습니다

SELECT name, COALESCE(MAX(NULLIF(value, 'NONE'), 'NONE') 
FROM <tablename> 
GROUP BY name 

내가 다음은 일반적인 경우 (하나 이상의 비 NONE이 가능한 값 없음)을 위해 일 것으로 예상 :

SELECT name, value FROM <tablename> WHERE value <> 'NONE' 
UNION 
SELECT name, value FROM <tablename> WHERE value = 'NONE' 
    AND name NOT IN (SELECT name FROM <tablename> WHERE value <> 'NONE') 
+0

필드 값이 텍스트이기 때문에 MAX 값이 없습니다. – mada

+0

@mada : 그건 아주 중요한 정보입니다. 아마도 그 질문에서 언급해야합니다. 그렇지 않으면 GROUP BY와 MAX가 좋은 해결책이 될 것입니다. –

+0

MAX는 여전히 텍스트 필드에서 작동합니다. 어느 하나의 이름 (NONE과 NONE이 아닌)에 대해 가능한 두 가지 값만있는 경우 MAX는 집계에서 Null을 제거하고 NONE이 아닌 단일 값을 남긴다는 사실을 이용할 수 있습니다. 이 값은 정의상 최대 값입니다. 특정 이름에 대해 NONE 값만 발견되면 MAX가 반환 한 NULL을 문자열 "NONE"으로 변경합니다 (이 경우를 처리하기 위해 지금 편집 추가). –

1

여기 당신이 그것을 할 수있는 하나의 방법이다 :

SELECT T1.NAME, T2.VALUE 
FROM (SELECT DISTINCT name FROM Table1) AS T1 
LEFT JOIN (SELECT * FROM Table1 WHERE VALUE IS NOT NULL) AS T2 
ON T1.NAME = T2.NAME 

결과 :

S NULL 
T A 
T B 
+0

두 번째 캔트는 두 번째 캔트가 (...)에서 1을 선택하면 결과가 (S, NONE) 필요하지 않으므로 1 열을 반환하고 첫 번째 쿼리는 무시됩니다. – mada

+0

@mada : 뭐라고 요? 나는 당신의 의견을 이해하지 못합니다. '없음'은 무엇입니까? 널 뜻하는거야? null은 조인이 아닌 * LEFT * 조인이기 때문에 무시되지 않습니다. 일치가 실패하면 LEFT 조인은 NULL을 반환합니다. –

+0

없음은 NULL을 의미합니다. – mada

관련 문제