2

一番上のレコードを除くすべてのレコードを削除するスクリプトを作成しようとしています (それがどれでも問題ない場合は、1 つのレコードが残っている必要があります)。これが私が今持っているフォーマットです:

DELETE FROM table
WHERE id NOT IN (
  SELECT id
  FROM (
    SELECT id
    FROM table
    ORDER BY id DESC
    LIMIT 1 ))

しかし、SQL Server 2005 では LIMIT が認識されない関数であることを認識しているため、どうすればよいか困っています。誰でもこのトピックに関する専門知識を持っていますか? そして、これらのレコードは複製されません.1つのレコードを除いてすべて取り出したいだけです.

アップデート:

ここで達成しようとしていることが完全に明確ではないことに気付きました。私がする必要があるのは、別の列に同じ値があることを考慮して、このテーブルの一番上のレコードを除くすべてを削除することです (それを「anotherid」と呼びましょう)。

したがって、次のようになります。

id        value       anotherid       
1          3           1
2          4           1
3          5           2
4          6           2
5          7           2

これに:

id        value       anotherid       
1          3           1
3          5           2
4

3 に答える 3

8
delete from table where id <> (select top 1 id from table order by id desc)
于 2012-08-08T17:03:39.160 に答える
3

私が理解しているように、アップデートを考えると:

DECLARE @x TABLE(id INT, value INT, anotherid INT);

INSERT @x SELECT 1, 3, 1
UNION ALL SELECT 2, 4, 1
UNION ALL SELECT 3, 5, 2
UNION ALL SELECT 4, 6, 2
UNION ALL SELECT 5, 7, 2;

;WITH y AS 
(
  SELECT id, rn = ROW_NUMBER() OVER 
   (PARTITION BY anotherid ORDER BY id) -- or order by value?
   FROM @x -- replace with your dbo.tablename
)
DELETE y WHERE rn > 1;

SELECT id, value, anotherid FROM @x;

結果:

id  value  anotherid
--- ------ ---------
1   3      1
3   5      2

元の質問への回答

他のいくつかのオプション:

-- use a CTE to identify the highest id,
-- then delete all rows except that one
;WITH x AS 
(
  SELECT id, rn = ROW_NUMBER() OVER (ORDER BY id DESC) 
  FROM dbo.table
)
DELETE x WHERE rn > 1;

-- use a subquery to get the max, and delete
-- all id values lower than that result
DELETE dbo.table WHERE id < (SELECT MAX(id) FROM dbo.table);

idが一意でない場合、これらは異なる動作をすることに注意してください。最高id10であり、が3行あるとしid = 10ます。一番上の答えは、テーブルに1行を残します。一番下の答え(およびエイドリアンの答え)は3行を残します。ORDER BYこれがシナリオであり、同点の場合でもテーブルに1行だけを残すことを意図している場合は、上部のクエリのにタイブレーク基準を追加できます。

于 2012-08-08T17:07:23.843 に答える
1

あなたのテーブルにはある種の一意の識別子があると思いますか?

そのためにこのようなことをします

delete from [table] 
where [uniqueColumn] <> 'value';

一意の列がない場合。
手動でテーブルに移動し、
「OMGWTFBBQSauce」のように一意にする行の値を変更します。
その後、

delete from [table] 
where [column] <> 'OMGWTFBBQSauce';
于 2012-08-08T17:06:51.057 に答える