从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
也将工作,但正如文件中所述:
用于
INSERT
,UPDATE
或DELETE
的TOP
expression式中引用的行不以任何顺序排列。
因此,最好使用WITH
和ORDER 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)