2012-10-26 1 views
0

그래서 우리 서버에서 중복 SQL 스크립트를 실행했지만 최근까지는 깨닫지 못했습니다. 본질적으로 동일한 열 x (crn)를 가진 2 개의 항목이있는 많은 행이 있습니다.SQL 하나의 열에서 중복 된 WHERE 선택 x AND 열 y! = z

처음에는 같은 열 y (상태)로 입력되었습니다. 응용 프로그램에서 사용자가 열 y (상태)를 업데이트하도록했습니다. 그러나 이제는 'S'상태와 'S'이외의 상태를 가진 2 행 1 개가 있습니다. 내 목표 :

중복되는 CRN이 있고 STATUS가 S 인 테이블에서 모두 삭제 중복이 없으면 행을 삭제하고 싶지 않지만 존재하지 않으면 행만 삭제하려고합니다. 상태는 'S'입니다. 또한, 둘 다 S 상태 인 경우 두 레코드를 모두 삭제하지는 않겠지 만, 그렇게 할 경우 다음 다운로드에서 다시 과정을 수강 할 것이기 때문에 큰 문제는 아닙니다.

내가 원하는 행을 쿼리하기 위해 SELECT 문을 만들기 시작했으나 SELECT IF DUPLICATE EXISTS 부분 만 수행하는 방법을 모릅니다. 중복이 존재하는 경우 UNION 또는 LEFT JOIN 또는 레코드 만 얻으려는 것이 필요합니다.

SELECT * FROM 
cas_usuECourses 
WHERE 
crn IN (SELECT crn FROM cas_usuECourses GROUP BY crn having count(1) > 1) 
AND status = 'S' 
AND termCode = 201320 

편집 : 말할 수있는 방법은 위의 ... 거기에 있지만, 모두 DUPS는 'S'를 한 경우에만 그 중 하나를 삭제 하시겠습니까?

편집 : 나는 이것이 나에게 좋다고 본다. 이견있는 사람?

SELECT id FROM (
    SELECT id, Row_Number() Over (Partition By crn ORDER BY id DESC) as ranking 
    FROM cas_usuECourses 
    WHERE status = 'S' 
    AND termCode = 201320 
) as ranking 

WHERE 순위로이있을 경우 =

난이 나에게 상태가 'S'는 모든 ID를 줄 것이라고 생각 하나, 그리고 'S'는이 날 만든 하나를 줄 것이다 둘째. 우리 termCode의 모든 엔트리가 중복되어 있다는 것을 알았습니다. 중복을 검사하는 것에 대해 걱정할 필요가 없습니다.

+0

무엇을 검색 했습니까? 시도 했습니까? 무슨 RDMS? 가능한 중복 : [여기] (http://stackoverflow.com/questions/18932/how-can-i-remove-duplicate-rows), [여기] (http://stackoverflow.com/questions/18932/how- can-i-remove-duplicate-rows/679449) 및 [여기] (http://stackoverflow.com/questions/6471463/how-to-delete-duplicates-in-sql-table-based-on-multiple-fields/679449). – Kermit

+0

글쎄, 나는 여기에 중복에 대한 정보를 찾고 있었지만, 내가 필요로하는 것과 같은 것을 보지 못한다. – Leeish

+0

여기에 대한 정보는 올바른 경로로 안내합니다. – Kermit

답변

0

테이블에 하나의 열을 추가하고 고유 한 값으로 채울 수 있다면 사소한 일입니다. 각 행을 대상으로 지정할 수 있습니다.

그렇지 않은 경우 첫 번째 단계 후에 일반적으로 상태 S로 된 하위 선택에서 커서를 열어 두 상태가 모두 'S'인 crn 만 선택하고 각 루프 반복에서 적절한 crn이있는 상위 1 레코드를 삭제하십시오. 그렇게하면 중복 된 crn/status 쌍을 제거 할 수 있습니다.

+0

커서에서 나를 잃어버린 – Leeish

+0

@Leeish - 커서는 비효율적이지만 때로는 (최소한 SQL Server에서) 데이터베이스 테이블 레코드를 반복하는 데 필요합니다. 예제 [here] (http://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/)를 참조하십시오. 커서를 사용하면이 문제를 해결할 수 있습니다. 그리고 프로덕션 서버에서 트랜잭션을 실행하는 경우 트랜잭션을 사용하여 코드를 테스트하는 것을 잊지 마십시오! – OzrenTkalcecKrznaric