0

ここでリードがどのように機能するかを誰か説明できますか?

DELETE table_name
WHERE  rowid IN
       ( SELECT LEAD(rowid) OVER
                (PARTITION BY key_values ORDER BY NULL)
         FROM   table_name );

また、ここで使用されていることを知りたいのですが、ROWIDrowidはできるだけ避けるべきだと思います。行IDを使用するのは正しいですか?その結果は何ですか?

上記の質問とは別に、サブクエリのみを起動した場合、すべての null 値を取得した後、重複レコードを取得する方法を確認しましたか?

4

1 に答える 1

3

このように使用しても問題ありませんROWID。これらは、同じステートメント内で安全に使用できます。行のROWIDが変更される可能性があるため(最初に取得した行とは異なる行を取得する可能性があるため)、取得してどこかに保存してから保存した値を再利用する必要はありませんが、1つのステートメント内ではこれで問題ありません。

lead()ここでは関数の使い方が間違っていると思います。指定された順序に基づいて、「次の」行の値を返します。そのため、次の行がないため、基本的に「最後の」ものを除くテーブルのすべてのROWIDが返されます。それがあなたが見ている NULL 値だと思います。

したがって、ステートメントは実際には、最後の行を除くすべての行をテーブルから削除します (その行の行 ID は null になるため)。

本当の意図は、テーブルから重複を削除することだったと思います。何かのようなもの:

DELETE table_name
WHERE rowid NOT IN (select min(rowid) 
                    from table_name 
                    group by key_values)
于 2013-06-19T11:43:46.623 に答える