我有一个基于GUID的主键表。我需要根据主键在此表中找到一条记录,然后删除此记录以及它之前出现的所有记录。是否有删除先前记录的命令,或者任何人都可以给我一些关于我如何做到这一点的示例SQL。
我正在使用SLQ服务器2008
答案 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中提取日期/时间,具体取决于它们的创建方式,但这通常是个坏主意。正如其他人所提到的,你应该使用身份或时间戳 - 它更容易,更安全,更健全。
相关链接: