Sql server 2005 当参数随组变化而不循环时,如何删除?(T-SQL)
假设我在一个表中有以下列:Sql server 2005 当参数随组变化而不循环时,如何删除?(T-SQL),sql-server-2005,tsql,Sql Server 2005,Tsql,假设我在一个表中有以下列: id int NOT NULL IDENTITY PRIMARY KEY, instant datetime NOT NULL, foreignId bigint NOT NULL 对于按Foreigned分组的每个组,我希望删除比maxinstant早1小时的所有行。因此,对于每组,参数是不同的 没有循环是否可能?是的,非常简单。试试这个: DELETE mt FROM MyTable AS mt WHERE mt.instant <= DATEAD
id int NOT NULL IDENTITY PRIMARY KEY,
instant datetime NOT NULL,
foreignId bigint NOT NULL
对于按Foreigned分组的每个组,我希望删除比maxinstant早1小时的所有行。因此,对于每组,参数是不同的
没有循环是否可能?是的,非常简单。试试这个:
DELETE mt
FROM MyTable AS mt
WHERE mt.instant <= DATEADD(hh, -1, (SELECT MAX(instant)
FROM MyTable
WHERE ForeignID = mt.ForeignID))
或者这个:
;WITH MostRecentKeys
AS
(SELECT ForeignID, MAX(instant) AS LatestInstant
FROM MyTable)
DELETE mt
FROM MyTable AS mt
JOIN MostRecentKeys mrk ON mt.ForeignID = mrt.ForeignID
AND mt.Instant <= DATEADD(hh, -1, mrk.LatestInstant)
是的,这很简单。试试这个:
DELETE mt
FROM MyTable AS mt
WHERE mt.instant <= DATEADD(hh, -1, (SELECT MAX(instant)
FROM MyTable
WHERE ForeignID = mt.ForeignID))
或者这个:
;WITH MostRecentKeys
AS
(SELECT ForeignID, MAX(instant) AS LatestInstant
FROM MyTable)
DELETE mt
FROM MyTable AS mt
JOIN MostRecentKeys mrk ON mt.ForeignID = mrt.ForeignID
AND mt.Instant <= DATEADD(hh, -1, mrk.LatestInstant)
我想假设当你说“比maxinstant早1个小时”时,你的意思是“比maxinstant早1个小时” 有鉴于此,几乎可以肯定有一种比这更简洁的方法,但它会起作用:
DELETE
TableName
WHERE
DATEADD(hh, 1, instant) < (SELECT MAX(instant)
FROM TableName T2
WHERE T2.foreignId = TableName.foreignId)
如果要查找更多信息,则内部子查询称为“相关子查询”。它的工作方式是,对于外部查询所考虑的每一行,子查询引用的是该行的异化。我假设当您说“比maxinstant早1小时”时,您的意思是“比该异化行的maxinstant早1小时” 有鉴于此,几乎可以肯定有一种比这更简洁的方法,但它会起作用:
DELETE
TableName
WHERE
DATEADD(hh, 1, instant) < (SELECT MAX(instant)
FROM TableName T2
WHERE T2.foreignId = TableName.foreignId)
如果要查找更多信息,则内部子查询称为“相关子查询”。它的工作方式是,对于外部查询所考虑的每一行,子查询引用的是该行的异化。我认为它工作了很长一段时间,但不幸的是,您的查询没有任何作用。对不起。它不工作是因为一些空字段,现在使用isNullableField,-1在正确的位置工作我认为它工作了很长一段时间,但不幸的是,您的查询没有任何作用。对不起。它不工作,因为一些空字段,现在isNullableField,-1在正确的位置工作