2016-09-22 4 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

のようなものを使用することができ、あなたがinを使用したい:

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

これはcolumnAがあることを前提としていグローバルにテーブル内で一意です。それ以外の場合は、少し難しくする必要があります。

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 . . . 
       ); 

そして、でもこれは、任意の列がNULL値(条件は簡単にこれを処理するように変更することができます)がある場合の動作は保証されません。

+0

これはユニークではありませんが、問題です:)一意性は50列を集約し、 columnAのMAX()。 2番目の解決策は面白そうですが、私はそれを試してみます。 – daZza

0

(また、そのテーブル内の他の列には、グローバルに一意ではありません)クエリは、あなたはおそらく

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) 
関連する問題