删除记录及其前面的所有记录

时间:2009-12-18 15:33:49

标签: sql sql-server

我有一个基于GUID的主键表。我需要根据主键在此表中找到一条记录,然后删除此记录以及它之前出现的所有记录。是否有删除先前记录的命令,或者任何人都可以给我一些关于我如何做到这一点的示例SQL。

我正在使用SLQ服务器2008

4 个答案:

答案 0 :(得分:2)

在你的问题中,你说“出现在它之前。”或“前面的记录”这个概念需要更明确地定义。 SQL基于集合论 - 并且在集合中对集合中的项目没有隐式顺序(表格中的行)您必须根据某些属性的值定义前面的含义。一排......

答案 1 :(得分:2)

鉴于 GUID 的性质以及您将其用作主键的事实,然后,您无法做到这一点。

如果您的辅助字段可能有助于订购,那么,或者如果您有 IDENTITY 字段。

基于指定的DateColumn:

看看这个

DECLARE @Table TABLE(
        ID uniqueidentifier,
        DateVal DateTime
)

INSERT INTO @Table SELECT NEWID(), '06 Jan 2009'
INSERT INTO @Table SELECT NEWID(), '05 Jan 2009'
DECLARE @GUID uniqueidentifier
SELECT @GUID = NEWID()
INSERT INTO @Table SELECT @GUID, '04 Jan 2009'
INSERT INTO @Table SELECT NEWID(), '03 Jan 2009'
INSERT INTO @Table SELECT NEWID(), '02 Jan 2009'
INSERT INTO @Table SELECT NEWID(), '01 Jan 2009'

SELECT  *
FROM    @Table

DELETE FROM @Table
WHERE   DateVal <= (SELECT DateVal FROM @Table WHERE ID = @GUID)

SELECT  *
FROM    @Table

答案 2 :(得分:1)

由于您使用GUID作为主键,因此无法单独确定任何顺序(除非您使用了NEWSEQUENTIALID(),甚至在重新启动之前它只会在同一个框中顺序执行),因此您需要另一个列,例如时间戳或标识来排序您的行。

答案 3 :(得分:0)

可以从某些 GUID中提取日期/时间,具体取决于它们的创建方式,但这通常是个坏主意。正如其他人所提到的,你应该使用身份或时间戳 - 它更容易,更安全,更健全。

相关链接: