2013-04-01 2 views
0

저는 이것을 간단하게 유지할 것입니다. 다른 열에 null이 없을 때 열에있는 모든 값을 선택하는 좋은 방법이 있는지 알고 싶습니다. 예를 들어. 위의 설정에서 SQL (TSQL) - 다른 열이 null이 아닌 열에서 값을 선택 하시겠습니까?

A  B 
----- ----- 

    1  7 
    2  7 
NULL  7 
    4  9 
    1  9 
    2  9 

난 그냥 B에서 9 싶을와 A.에서 NULL을 가지고 있지 7 7 때문에 분명히 내가 서브 쿼리로이 싸서 IN 절 등을 사용할 수 있지만, 이것은 이미의 일부입니다 꽤 독창적 인 세트이며 효율적으로 유지하려고합니다.

나는 단지 A를 B의 값을 반환하고 검토 할 것이라고 ... 내 목적이 단지 단방향 비교를 할 것이라는 점을주의해야한다 나는이 작업을 수행 할 수있는 쉬운 방법이 상상

그 나는 실종되었다. 그러나 나는 지금 그것을 보지 못하는 것들의 두꺼운 곳에있다. 마지막으로, 당신은 윈도우 기능을 사용할 수

select b 
from t 
group by b 
having sum(case when a is null then 1 else 0 end) = 0; 

을 그리고 : 당신은 별개의 B 값을 원하는 경우에

select * 
from t 
where t.b not in (select b from t where a is null); 

은, 당신은 할 수 있습니다 :

답변

1

당신은 이런 식으로 뭔가를 할 수

select a, b 
from (select t.*, 
      sum(case when a is null then 1 else 0 end) over (partition by b) as NullCnt 
     from t 
    ) t 
where NullCnt = 0; 
+0

두 번째 예는 제 목적에 실제로 적합합니다! 나는 이것 모두가 관계형 분할을 피하는 부분이라는 것을 알아야한다. –

1

아래 쿼리는 최종 결과에서 하나의 열만 출력합니다. 레코드는 B 열로 그룹화되고 레코드가 null인지 테스트합니다. 레코드가 null 일 때 그룹의 값은 1 씩 증가합니다. HAVING 절은 0 값을 가진 그룹 만 필터링합니다.

SELECT B 
FROM TableName 
GROUP BY B 
HAVING SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0 

레코드에서 모든 행을 가져 오려면 join을 사용할 수 있습니다.

SELECT a.* 
FROM TableName a 
     INNER JOIN 
     (
      SELECT B 
      FROM TableName 
      GROUP BY B 
      HAVING SUM(CASE WHEN A IS NULL THEN 1 ELSE 0 END) = 0 
     ) b ON a.b = b.b 
관련 문제