是否可以在SQL Server
不使用任何WHERE
条件且不使用游标的情况下从中的表中删除“第一条”记录?
是否可以在SQL Server
不使用任何WHERE
条件且不使用游标的情况下从中的表中删除“第一条”记录?
Answers:
WITH q AS
(
SELECT TOP 1 *
FROM mytable
/* You may want to add ORDER BY here */
)
DELETE
FROM q
注意
DELETE TOP (1)
FROM mytable
也可以使用,但是,如文档中所述:
在所引用的行
TOP
表达与所用INSERT
,UPDATE
或DELETE
不按任何顺序排列。
因此,最好使用WITH
和ORDER BY
子句,它可以让您更准确地指定您认为第一行。
WITH
在表达式中使用时,以前的sql语句应以分号(;)终止
ORDER BY 1
将对SQL Server中许多人的表提供微妙的改进:您将获得具有最低主键值的行,很可能是“第一”行。(是的,有些表没有PK作为第一列,但它1
是我最喜欢的惰性快捷方式,我想与他人分享。)
1
。
取决于您的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;
定义“第一”?如果表中有一个PK,那么它将按该顺序排序,您可以按此删除:
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,则无法保证订购...
这真的有意义吗?
关系数据库中没有“第一”记录,您只能删除一个随机记录。
“表中的“第一个”记录”是什么意思?我认为,在关系数据库中没有“第一记录”这样的概念。
使用MS SQL Server 2005,如果要删除“最高记录”(执行简单的“ * select * from tablename *”时显示的第一个记录),则可以使用“ delete from tablename top(1) ” ...但是要注意,这不能确保从记录集中删除哪一行,因为它只是删除了如果您运行命令“ select from tablename(select top(1)from tablename) ”将显示的第一行。
类似于所选答案,可以使用表源,在这种情况下,可以使用派生查询:
delete from dd
from (
select top 1 *
from my_table
) dd
随时添加orderbys和条件。
对于下一个示例,我假设对“ where”的限制是由于不想基于其值选择行。因此,假设我们要基于位置(在本例中为第一个位置)删除行:
delete from dd
from (
select
*,
row = row_number() over (order by (select 1))
from my_table
) dd
where row = 1
请注意,(选择1)使其成为表或索引所在的排序顺序。您可以将其替换为newid,以获得相当随机的行。
例如,您还可以通过删除每个颜色的第一行来添加分区。