2016-06-21 3 views
0

다른 열의 데이터를 기반으로 열의 중복 데이터를 선택하려고합니다. 예를 들어 'IN_PROGRESS'또는 'COMPLETE'이벤트 표가 있습니다. 그들은 각각 ID를 가지고 있습니다. 이벤트 중 일부는 동일한 ID이지만 상태가 다릅니다. status = in_progress 또는 status = complete이지만 해당 ID가 동일한 경우에만 데이터를 선택하려고합니다.Oracle sql - 다른 필드를 기반으로하는 열의 중복 값을 찾습니다.

SELECT id, count (*) 
FROM events WHERE status = 'IN_PROGRESS' OR status = 'STARTED' 
GROUP BY id HAVING count (*) > 1; 

을하지만, 분명히 그것은 단지 식별자가 아닌 전체 행이 그래서 모든 데이터를 볼 수 없습니다 반환

이것은 내가 지금까지 노력하고 있습니다 것입니다. 궁극적으로 위의 내용을 기반으로 중복을 필터링하면서 테이블의 모든 데이터를 선택하려고합니다.

제가 조인을 보거나 복제 테이블과 비교하기 시작했는데 필요한 것을 얻는 가장 좋은 방법이 무엇인지 모르겠습니다. 누군가 제발 도와 줄 수 있니?

감사

당신은 중복 레코드를 감지 쿼리에 의해 생성 된 파생 테이블에 JOIN와 함께 할 수
+0

'status'를 제외하고,'id'가 같은 경우 다른 모든 필드의 값은 같습니까? – Cynical

+0

MySQL과 무슨 상관이 있습니까? 나는 MySQL 태그를 SQL 태그로 대체하려고한다. –

+0

중복 된 것이 어떻게 발생했는지 궁금합니다. 이벤트 테이블이있어서 각 레코드는 하나의 이벤트를 나타내야합니다. 이벤트는 ID로 식별되므로 복제본은 어떻게 될 수 있습니까? ID가 테이블의 기본 키가 아닌 이유는 무엇입니까? –

답변

1

:

SELECT * 
FROM (
    SELECT *, 
     COUNT(CASE WHEN status = ('IN_PROGRESS', 'STARTED') THEN 1 END) 
     OVER (PARTITION BY id) AS cnt 
    FROM events) e 
WHERE e.cnt > 1 
:

SELECT e1.*, e2.cnt 
FROM events e1 
JOIN (
    SELECT id, count (*) cnt 
    FROM events 
    WHERE status = ('IN_PROGRESS', 'STARTED') 
    GROUP BY id 
    HAVING count (*) > 1 
) e2 ON e1.id = e2.id 

은 또한 당신이 윈도우 기능을 사용할 수 있습니다

+0

'STARTED' 또는'IN_PROGRESS'가 한 번 더 나타나면이 기능이 작동하지 않습니다. 상태를 필터링하고'COUNT (DISTINCT ..)' – sagi

1

시도

SELECT * FROM events e1 
WHERE e1.status IN ('IN_PROGRESS' , 'STARTED') 
    AND EXISTS (
    SELECT 1 FROM events e2 
    WHERE e2.id = e1.id 
    AND e2.status IN ('IN_PROGRESS' , 'STARTED') 
    AND e1.status <> e2.status 
) 
관련 문제