【问题标题】:SQL Delete specific records with conditionSQL 删除带有条件的特定记录
【发布时间】:2014-04-04 04:33:22
【问题描述】:

我有一张如下表:

而删除条件是:

仅当日期小于特定日期且没有记录大于该日期时从员工中删除

例如

  • 如果日期是 2014 年 3 月 8 日,那么只有 EmployeeID 3 的记录将被删除,因为 EmployeeID 4 的记录的日期大于 2014 年 3 月 8 日,而 EmployeeID 5 的记录不会被删除,因为日期是2014 年 3 月 9 日
  • 如果日期是 3/9/2014,则 EmployeeID 为 3 和 5 的记录将被删除,因为 EmployeeID 为 4 的记录的日期大于 2014 年 3 月 9 日

一开始我试过

delete from Employee where Date > @Date

但是上面的 SQL 会删除日期小于@Date 的所有记录

上面的SQL需要做哪些修改?

【问题讨论】:

  • 记录 4 的日期小于 2014 年 3 月 8 日,即 2014 年 3 月 7 日,它也将被删除。

标签: sql sql-server


【解决方案1】:

试试这个:

DELETE FROM TableName
WHERE EmployeeID IN 
(SELECT EmployeeID FROM TableName
 GROUP BY EmployeeID
 HAVING MAX(DATE)<=@Date)

经过测试和验证。

查看SQL Fiddle 中的示例。

【讨论】:

  • 从 in 子句中的 Select 中移除 max(date) 列
  • @SoulTrain:已删除。谢了哥们。现在经过测试和验证。
  • 你应该有
  • @AK47 用户条件1和2相互矛盾。
  • @damien,怎么样?你能解释一下吗?
【解决方案2】:

试试这个:

delete from Employee
where EmployeeID in
(select EmployeeID 
from Employee
group by Employeeid
having max(Date) < @Date)

【讨论】:

    【解决方案3】:

    来了,

    Declare @d date ='3/8/2014'
    
    
    delete from myEmp where empID in
    (
    select empID from myEmp
    group by empID
    having MAX(empDate) <=@d
    )
    

    演示链接, DEMO

    【讨论】:

      【解决方案4】:
      create table #t (EmployeeID int, Date datetime)
      
      insert #t values 
      (3, '20140304'),
      (3, '20140305'),
      (3, '20140306'),
      (4, '20140307'),
      (4, '20140308'),
      (4, '20140310'),
      (5, '20140309')
      
      declare @date date = '20140308'
      
      ;with x as (
          select t.*
          from #t t
          where Date <= @date and not exists (
          select * from #t t2 where t.EmployeeId = t2.EmployeeID and Date > @date)
      )
      delete x;
      

      【讨论】:

        猜你喜欢
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        相关资源
        最近更新 更多