2017-09-09 11 views
0

나는이 다음 표 : C3가 null하지만 어디 기록을 삭제할삭제 행은 기록의 사본이 존재하는 경우에만

만 때와 다른 레코드 c1과 c2에 대한 동일한 값이 이미 있습니다. 즉, 빨간색 화살표가 표시된 행만 제거하십시오. 어떻게해야합니까? 당신은 당신이 그것을 실행하고 행을 삭제할 선택하는 확인할 수 있습니다 accidentally- 붙여 넣기 및 호스 뭔가를 복사하지 않도록

enter image description here

답변

1

는 I는 선택으로 이것을 쓸 것이다

SELECT * 
FROM table t1 
WHERE 
    t1.c3 IS NULL AND 
    EXISTS(
    SELECT null FROM table t2 
    WHERE t1.c1 = t2.c1 AND COALESCE(t1.c2, 'value that will never appear in the table') = COALESCE(t2.c2, 'value that will never in the table') AND t2.c3 IS NOT NULL 
    ) 
삭제

변환은 삭제와 함께 * 선택을 교체하는 경우해야하지만, 그것이 작동하지 않을 경우 ...

편집 발언을 언급 마십시오

을 0

행 X에서 null의 c2 값이 행 Y에서 다른 c2 값과 같음을 확인하는 방법을 데모하는 데 사용됩니다. '테이블에 표시되지 않는 값' SQL 내에서 두 경우 모두 동일하며 테이블에 나타나지 않을 수 있습니다. 그렇지 않으면 null이있는 행이 실제 값을 가진 다른 행과 일치합니다.

+0

나는 그렇게 생각합니다! 고맙습니다. – geek2000

+0

나는 이것을 실제 테이블에 대해 실행한다. 이것이 작동하지 않는 경우가 하나 이상 있습니다. 예를 들어 두 개의 레코드 ('B', null, '15 ')가있는 경우 ('B ', null, null) 코드가 반환되지 않습니다 ('B ', null, null). 이것에 대한 하위 쿼리에서 c2 제거 이외의? 12 열 및 그들 중 하나는 null 값을 가질 수 있습니다. – geek2000

+0

기술적으로 null이 결코 다른, 심지어 다른 null과 같지 않습니다 있지만 만드는 경우. c2에 대한 null은 다른 행과 동일합니다. 따라서 c1과 동일한 로그이므로 coalesce를 사용하여 null을 일치하는 값으로 변환 할 수 있습니다. 내 대답을 편집하여 –