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在正确的位置工作