我有一个SQL问题,我无法处理。
我需要删除表中的行,这些行在date_to列中为NULL,但与date_from列具有不同的值。
我要删除的列是编号为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的日期相同的所有行,从那里我丢失了:)
答案 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)