从SQL Server中的表中删除“第一个”logging,没有WHERE条件

是否有可能从SQL Server的表中删除“第一个”logging,而不使用任何WHERE条件和不使用游标?

 WITH q AS ( SELECT TOP 1 * FROM mytable /* You may want to add ORDER BY here */ ) DELETE FROM q 

注意

 DELETE TOP (1) FROM mytable 

也将工作,但正如文件中所述:

用于INSERTUPDATEDELETETOPexpression式中引用的行不以任何顺序排列。

因此,最好使用WITHORDER BY子句,它可以让你更确切地指定哪一行是你认为是第一个。

取决于你的DBMS (人们似乎不知道现在是什么)

 -- MYSql: DELETE FROM table LIMIT 1; -- Postgres: DELETE FROM table LIMIT 1; -- MSSql: DELETE TOP(1) FROM table; -- Oracle: DELETE FROM table WHERE ROWNUM = 1; 

不,AFAIK,这是不可能做到的。

没有定义的“第一”logging – 在不同的SQL引擎上,“ SELECT * FROM table ”很可能每次都以不同的顺序返回结果。

定义“第一”? 如果表有一个PK,那么它将按这个顺序sorting,你可以通过这个方法删除:

 DECLARE @TABLE TABLE ( ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, Data NVARCHAR(50) NOT NULL ) INSERT INTO @TABLE(Data) SELECT 'Hello' UNION SELECT 'World' SET ROWCOUNT 1 DELETE FROM @TABLE SET ROWCOUNT 0 SELECT * FROM @TABLE 

如果表没有PK,那么sorting不会得到保证…

这真的有意义吗?
关系数据库中没有“第一个”logging,只能删除一个随机logging。

你从一张桌子上的“第一”logging是什么意思? 关系数据库中没有“第一条logging”这样的概念,我想。

使用MS SQL Server 2005,如果您打算删除“最高logging”(当您执行简单的“select * from tablename *”时显示的第一条logging),则可以使用“ delete top(1)from tablename ” …但是请注意,这并不能确保从logging集中删除哪一行,因为它只是删除了第一行,如果您运行命令“ select table(select from tablename) ”将会出现。

类似于所选的答案,可以使用一个表格源,在这种情况下是派生的查询:

 delete from dd from ( select top 1 * from my_table ) dd 

随意添加orderbys和条件。

对于下一个示例,我将假定对“where”的限制是由于不希望根据其值select行。 所以假设我们想要删除一个基于位置的行(在本例中是第一个位置):

 delete from dd from ( select *, row = row_number() over (order by (select 1)) from my_table ) dd where row = 1 

请注意,(select 1)使它成为表或索引所在的sorting顺序。您可以用newidreplace它以获得相当随机的行。

例如,您也可以通过添加一个分区来删除每种颜色的第一行。

SQL-92:

 DELETE Field FROM Table WHERE Field IN (SELECT TOP 1 Field FROM Table ORDER BY Field DESC)