2012-05-06 15 views
0

次のSQL文は、選択したテーブルのすべての行を削除しているようです。それは、難易度が1に等しいトップ10以外のすべてを削除することです。上位10行以外のすべてを削除する

DELETE FROM Scores 
WHERE Highscore_ID 
NOT IN (SELECT TOP 10 highScore FROM Scores WHERE difficulty = 1 ORDER BY HighScore DESC) 

これがすべての行を削除する理由は何ですか?サブクエリを実行すると、適切な行が選択されますが、削除するとすべての行が削除されるように見えます。

答えて

3

Hichscore_IdとhighScore列を比較します。それらの列は実際に同じ値を持っていますか?

そして、それは

DELETE FROM Scores 
WHERE Highscore_ID NOT IN 
      (SELECT TOP 10 HighScore_ID 
      FROM Scores 
      WHERE difficulty = 1 
      ORDER BY HighScore DESC); 

EDIT次のようになります。この

DELETE FROM Scores 
JOIN (SELECT ROW_NUMBER() OVER (ORDER BY highscore) AS your_row, * 
     FROM Scores 
     WHERE difficulty = 1 
     ORDER BY HighScore DESC) AS score2 ON score2.HighScore_ID = Scores.HighScore_ID 
WHERE Scores.difficulty = 1 AND score2.your_row>10 
+0

はID番号ではなく、に基づいて上位10得点idを選択するサブクエリでhighscore_IDを選択しないだろう実際のハイスコア? – Euthyphro

+0

あなたはサブクエリのためにHighscore_Idを返さなければなりませんが、そうであれば順序は合わないでしょう。あなたは一般的にあなたのテーブルにランクを追加し、ランク> 11ですべてを削除する必要があります)、それは動作します。 – YvesR

+0

ありがとうございます。 "スコアから削除 難易度= 1 AND Highscore_ID NOT IN(難易度= 1 ORDER BY highScore DESC)のスコアを選択します; – Euthyphro

2

これは誤植なのか実際のエラーなのか分かりませんが、select句はハイスコアではなくhighscore_idを参照する必要があります。

0

私の最初の推測が困難ハイスコアDESC BY = 1 ORDERスコアの上位10のハイスコアを選択」だろう試してみてください

"nullを返す可能性があります。

私の2番目の推測は "highscore_id"と "highscore"とは異なるので、重複はありません(削除されるものはありません)。

間違いなくはサブクエリを再確認し、期待するキーが返されていることを確認してください。

1

これを試してみてください:

with a as 
(
select ROW_NUMBER() over(order by name) as ordinal, * from test 
) 
delete from a where a.ordinal > 10; 

関連:http://www.ienablemuch.com/2012/03/possible-in-sql-server-deleting-any-row.html


サンプルデータ:

CREATE TABLE [beatles] 
    ([name] varchar(14)); 

INSERT INTO [beatles] 
    ([name]) 
VALUES 
    ('john'), 
    ('paul'), 
    ('george'), 
    ('ringo'), 
    ('pete'), 
    ('brian'), 
    ('george martin'); 

問合せ:

with a as 
(
    select *, row_number() over(order by name) ordinal 
    from beatles 
) 
delete from a 
where ordinal > 4; 

select * from beatles; 

前削除:

NAME 
brian 
george 
george martin 
john 
paul 
pete 
ringo 

削除した後:

NAME 
brian 
george 
george martin 
john 

ライブテスト:http://www.sqlfiddle.com/#!3/0adcf/6

関連する問題