2016-09-22 3 views
0

특정 쿼리에서 반환되는 모든 레코드를 삭제하려고하지만 적절한 방법을 찾을 수 없습니다. 그러나 DELETE FROM mytable WHERE EXISTS (subquery),했는데, 그 테이블에서 모든 레코드를 삭제뿐만 아니라 하위 쿼리에 의해 선택된 것들.하위 쿼리에서 반환 된 모든 레코드를 삭제하는 방법?

SELECT 
MAX(columnA) as columnA, 
-- 50 other columns 
FROM myTable 
GROUP BY 
-- the 50 other columns above 
having count(*) > 1; 

이 충분히 쉬워야한다,하지만 내 마음은 지금 당장 붙어 :

내 하위 쿼리는 다음과 같습니다. 나는 어떤 제안에 감사드립니다.

편집 : 주어진 필드의 값의 결과에되도록 테이블의 모든 행을 삭제해야하는 경우 COLUMNA이 고유하지

+0

뭔가를 시도,이를 달성하기 위해. – jarlh

답변

1

같은 것을 사용할 수 있습니다 전체적으로 테이블에 고유합니다. 그렇지 않으면 조금 더 열심히해야합니다. 심지어이 (조건이 쉽게 처리하기 위해 수정 될 수 있지만) 모든 열이 NULL 값이있는 경우 작동하지 않을 수 있습니다

DELETE FROM myTable t 
    WHERE EXISTS (SELECT 1 
        FROM (SELECT MAX(columnA) as columnA, 
           col1, col2, . . . 
         FROM myTable 
         GROUP BY -- the 50 other columns above 
         HAVING count(*) > 1 
         ) t2 
        WHERE t.columnA = t2.columnA AND 
         t.col1 = t2.col1 AND 
         t.col2 = t2.col2 AND . . . 
       ); 

그리고,.

+0

고유하지는 않습니다. 고유성은 모든 50 개의 열을 집계하고 columnA의 MAX(). 두 번째 해결책은 흥미로워 보이지만, 나는 그것을 시도 할 것이다. – daZza

0

(해당 테이블의 다른 열은 전 세계적으로 유일한 없음)

DELETE FROM myTable 
    WHERE columnA IN (SELECT MAX(columnA) as columnA 
         FROM myTable 
         GROUP BY -- the 50 other columns above 
         HAVING count(*) > 1 
        ); 

columnA가 있다고 가정 : 쿼리, 당신은 in 사용하려는, 아마

delete table 
my column in (select column from ...) 
+0

열이 유일한 값인 경우에만 작동합니다. 불행히도 내 경우에는 아닙니다. 유일한 레코드를 얻을 수있는 유일한 방법은 모든 50 개의 열을 집계하고 columnA에 MAX() 함수를 사용하는 것입니다. – daZza

0

고유성에만 열 집합에 의해 보장되는 경우 또 다른 해결책 :

delete table1 where (col1, col2, ...) in (
    select min(col1), col2, ... 
    from table1 
    where... 
    group by col2, ... 
) 

Null 값은 무시하고 삭제되지 않습니다.

당신은 상관 하위 쿼리를 필요

with data (id, val1, val2) as 
(
select 1, '10', 10 from dual union all 
select 2, '20', 21 from dual union all 
select 2, null, 21 from dual union all 
select 2, '20', null from dual 
) 
-- map null values in column to a nonexistent value in this column 
select * from data d where (d.id, nvl(d.val1, '#<null>')) in 
(select dd.id, nvl(dd.val1, '#<null>') from data dd)