Is there any way to delete all the rows in a table except one (random) row, without specifying any column names in the DELETE statement?
I’m trying to do something like this:
CREATE TABLE [dbo].[DeleteExceptTop1]([Id] INT)
INSERT [dbo].[DeleteExceptTop1] SELECT 1
INSERT [dbo].[DeleteExceptTop1] SELECT 2
INSERT [dbo].[DeleteExceptTop1] SELECT 3
SELECT * FROM [dbo].[DeleteExceptTop1]
DELETE
FROM [dbo].[DeleteExceptTop1]
EXCEPT
SELECT TOP 1 * FROM [dbo].[DeleteExceptTop1]
SELECT * FROM [dbo].[DeleteExceptTop1]
The final SELECT should yield one row (could be any of the three).
Or similar to @abatishchev’s answer but with more variety in the ordering and avoiding deprecated constructs.
Or a final way that uses
EXCEPTand assumes no duplicate rows and that all columns are of datatypes compatible with theEXCEPToperator