0

私はこのSQLクエリを持っています.movi​​e_nameによってテーブルで見つかった重複を選択します:

SQL:

SELECT movies.movie_name, movies.year FROM movies
INNER JOIN (SELECT movie_name FROM movies
GROUP BY movie_name HAVING count(movie_id) > 1) dup ON movies.movie_name = dup.movie_name
// want also to test for same year, not just movie_name i.e movies.year = dup.year

これは可能ですか?

4

2 に答える 2

1
SELECT movies.movie_name, movies.year FROM movies
INNER JOIN (SELECT movie_name, year FROM movies
GROUP BY movie_name,year HAVING count(movie_id) > 1) dup ON movies.movie_name = dup.movie_name
and movies.year = dup.year

合理的なスタートと思われる...

1つを削除することで、1つを保持することを意味すると思います。複数の重複がある可能性があることを忘れないでください

最初のものを保持して残りを取り除き、最も古いmovie_idを持つものが最初であるとしましょう

そう

Select Min(Movie_id), Movie_Name, Year From Movies Group By Movie_Name, Year

保持するすべてのものをあなたに与えるでしょう

Select Movie_id,Movie_Name,Year From Movies m 
Left Join 
(Select Min(Movie_id), Movie_Name, Year From Movies Group By Movie_Name, Year) keep
On keep.movieid = m.movieid Where keep.Movie_Id is null

上記は、映画に含まれているが、保持したいすべてのクエリには含まれていないすべてのレコードです。

それで、あなたが取り除きたいと思うものはすべて私たちに与えられます. クトゥルフのために、これについて私やあなた自身を信用しないでください! 削除する前にバックアップを取ってください!

Delete m From Movies m 
Left Join 
(Select Min(Movie_id), Movie_Name, Year From Movies Group By Movie_Name, Year) keep
On keep.movieid = m.movieid Where keep.Movie_Id is null

これで、証明したクエリを取得し (証明したのはあなたではないことを証明しました!)、問題のあるレコードを選択する代わりに、それらを削除します。

バックアップをお忘れなく!

于 2012-11-28T18:05:50.653 に答える
0

を使用するトニーのアイデアが本当に好きMINです。ただし、クエリ全体をより簡単にすることができます。

DELETE FROM movies WHERE movie_id NOT IN 
(SELECT MIN(movie_id) FROM movies GROUP BY movie_name, year);
于 2012-11-28T23:16:36.920 に答える