首页 > 解决方案 > 如何删除记录组

问题描述

我在查询时遇到了一些问题,我不知道如何继续

表结构

create table event(
  evn_id int identity(1,1),
  name varchar(90)
)

create table eventdate(
  evd_id int identity(1,1),
  evd_evn_id int references event(evn_id),
  evd_start smalldatetime,
  evd_end smalldatetime null,
  evd_picked bit,
)

测试数据

Insert into eventdate
VALUES('1','1','2018-08-28 09:00:00','NULL','1'),
    ('1','2','2018-04-26 09:00:00','NULL','0'),
    ('1','3','2018-02-25 09:00:00','NULL','0'), 
    ('2','4','2018-03-26 15:00:00','NULL','1'),
    ('2','5','2018-04-25 09:00:00','NULL','0')

Insert into event
VALUES('1','test'),
('2','test')

每个事件可以有 1 个或多个事件日期,一个事件日期有 1 个事件

我有以下内容,它给了我一个包含 1 或 0 个选择日期的事件日期列表

SELECT * 
FROM eventdate
WHERE evd_evn_id IN(
    SELECT evd_evn_id
    FROM eventdate
    GROUP BY evd_evn_id
    HAVING COUNT(CASE WHEN evd_picked = 1 then 1 else null end) <= 1)
ORDER BY evd_evn_id

我现在要做的是删除每个 evd_evn_id 的所有记录,如果 evd_evn_id 的日期是之前创建的选取日期(evd_picked = 1),例如“20180613”

它应该返回的是

'2','4','2018-03-26 15:00:00','NULL','1'
'2','5','2018-04-25 09:00:00','NULL','0'

标签: sqlsql-server

解决方案


因此,如果我理解您的问题,如果已选择任何事件日期并且开始日期在“20180613”之前,则您需要事件日期表中的所有记录。

我从您预期的结果中假设这一点。我会使用以下内容:

SELECT * 
FROM eventdate
WHERE evd_id in(
select evd_id from eventdate    WHERE evd_start < '2018-06-13' and evd_picked = 1)

删除:

DELETE FROM  eventdate
WHERE evd_id in(
select evd_id from eventdate    WHERE evd_start < '2018-06-13' and evd_picked = 1)

推荐阅读