是否可以从SQL Server
中的表中删除“第一个”记录,而不使用任何WHERE
条件而不使用游标?
答案 0 :(得分:129)
WITH q AS
(
SELECT TOP 1 *
FROM mytable
/* You may want to add ORDER BY here */
)
DELETE
FROM q
请注意
DELETE TOP (1)
FROM mytable
也会有效,但正如documentation中所述:
与
TOP
,INSERT
或UPDATE
一起使用的DELETE
表达式中引用的行不按任何顺序排列。
因此,最好使用WITH
和ORDER BY
子句,这样您可以更准确地指定您认为哪一行是第一行。
答案 1 :(得分:40)
取决于您的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;
答案 2 :(得分:6)
不,AFAIK,它不可能便携。
无论如何都没有定义“第一”记录 - 在不同的SQL引擎上,“SELECT * FROM table
”完全可能每次都以不同的顺序返回结果。
答案 3 :(得分:3)
定义“第一”?如果表有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,则无法保证订购......
答案 4 :(得分:1)
这真的有意义吗? 关系数据库中没有“第一”记录,您只能删除一条随机记录。
答案 5 :(得分:1)
你从表中的“第一个”记录是什么意思?我认为在关系数据库中没有“第一条记录”这样的概念。
使用MS SQL Server 2005,如果您打算删除“顶级记录”(当您执行简单的“* select * from tablename *”时显示的第一个记录),您可以使用“ delete top (1)来自tablename “...但请注意,这并不能确保从记录集中删除哪一行,因为它只删除了运行命令” select时将显示的第一行topname(1)from tablename “。
答案 6 :(得分:0)
与所选答案类似,可以使用表源,在这种情况下是派生查询:
delete from dd
from (
select top 1 *
from my_table
) dd
随意添加订单和条件。
对于下一个示例,我将假设对'where'的限制是由于不想根据其值选择行。因此,假设我们想要根据位置删除一行(在这种情况下是第一个位置):
delete from dd
from (
select
*,
row = row_number() over (order by (select 1))
from my_table
) dd
where row = 1
请注意,(select 1)使它成为表或索引所在的排序顺序。您可以用newid替换它以获得相当随机的行。
例如,您还可以添加分区以删除每种颜色的顶行。
答案 7 :(得分:-1)
SQL-92:
DELETE Field FROM Table WHERE Field IN (SELECT TOP 1 Field FROM Table ORDER BY Field DESC)