2012-05-06 69 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); 

编辑:

试试这个

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

会不会选择highscore_ID子查询基础上的ID号码,而不是选择的前10分的id实际的高分? – Euthyphro

+0

那么你必须为你的子查询返回Highscore_Id,但是,那么订单就不适合。你必须在你的表格中添加一个普通的等级并删除所有等级> 11),那么它就可以工作。 – YvesR

+0

谢谢。 “DELETE FROM SCORE WHERE difficulty = 1 AND Highscore_ID NOT IN(SELECT TOP 10 Highscore_ID FROM Scores WHERE difficulty = 1 ORDER BY highScore DESC);” – Euthyphro

2

不知道这是一个错字还是一个真正的错误,但您的select子句应该引用highscore_id,而不是高分。

0

我的第一个猜测是“SELECT TOP 10排行榜FROM成绩WHERE难度= 1个ORDER BY高分DESC “可能会返回null。

我的第二个猜测是“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

相关问题