删除表中的行为NULL且具有相同的DATE

时间:2016-11-11 14:31:15

标签: sql-server tsql

我有一个SQL问题,我无法处理。

我需要删除表中的行,这些行在date_to列中为NULL,但与date_from列具有不同的值。

table

我要删除的列是编号为3的列。

它在date_from中具有相同的值,并且为null。

这是我自己的做法:

select
    date_from, id, count(*) number_of_rows_with_the_same_datefrom
from 
    test
group by 
    date_from, id
having 
    count(*) > 1

这将返回具有相同ID的日期相同的所有行,从那里我丢失了:)

2 个答案:

答案 0 :(得分:2)

另一种选择是使用CTE和Row_Number()

;with cte as (
    Select *
          ,RN=Row_Number() over (Partition By ID, date_from Order by date_to Desc)
     From  YourTable
)
Select *        --<< Remove if Satisfied
--Delete        --<< Remove comment if Statisfied
 From cte
 Where RN>1 and date_to is null

返回(要删除的记录)

ID  name    date_from   date_to RN
2   Jim     2012-08-01  NULL    2

答案 1 :(得分:0)

使用exists语句,这看起来应该非常简单。

DELETE FROM table A
WHERE exists (SELECT 1 
              FROM table B 
              WHERE A.Id = B.ID 
                and A.Date_from = B.date_from 
                and A.Name = B.Name
                and B.Date_To is null)

假设ID和Name以及date_from构成某种关键......我知道PK在这张桌子上的含义会更加舒服。 (或者如果存在唯一索引)

验证它能做你想做的事情;首先运行。

SELECT * 
FROM table A
WHERE exists (SELECT 1 
              FROM table B 
              WHERE A.Id = B.ID 
                and A.Date_from = B.date_from 
                and A.Name = B.Name
                and B.Date_To is null)