0

選択したテーブルのすべての行を削除しているように見える次のSQLステートメントがあります。やるべきことは、難易度が1に等しいトップ10を除くすべてを削除することです。

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

これがすべての行を削除する理由について何か提案はありますか?サブクエリを実行するときは適切な行を選択しますが、削除するときはすべての行を削除したいようです。

4

4 に答える 4

4

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

編集:

これを試して

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
于 2012-05-06T07:55:28.340 に答える
2

これがタイプミスなのか実際のエラーなのかはわかりませんが、select句はhighscoreではなくhighscore_idを参照する必要があります。

于 2012-05-06T07:54:51.593 に答える
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

于 2012-05-06T08:44:03.463 に答える
0

私の最初の推測は、「SELECT TOP 10 highScore FROMScoresWHERE難易度=1ORDER BYHighScoreDESC」がnullを返す可能性があるということです。

私の2番目の推測では、「highscore_id」は「highscore」とは異なるため、重複はありません(そして何も削除されません)。

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

于 2012-05-06T07:56:30.640 に答える