Sql 根据以下规则从表中删除记录

Sql 根据以下规则从表中删除记录,sql,sql-server,Sql,Sql Server,规则1:在Yearquarter中使用如果有多行status='a'和i类型,则不应删除该Yearquarter中的任何行 规则2:如果在Yearquarter中有一行status='a'和类型3,4,并且所有其他行具有不同的状态和类型,我们需要删除所有这些行 而yearquarter应该保留一行类型为3,4的status='a' 这是emp表 +-------+-------------+------+--------+ | EMPID | YEARQUARTER | TYPE | STATU

规则1:在Yearquarter中使用如果有多行status='a'和i类型,则不应删除该Yearquarter中的任何行

规则2:如果在Yearquarter中有一行status='a'和类型3,4,并且所有其他行具有不同的状态和类型,我们需要删除所有这些行 而yearquarter应该保留一行类型为3,4的status='a'

这是emp表

+-------+-------------+------+--------+
| EMPID | YEARQUARTER | TYPE | STATUS |
+-------+-------------+------+--------+
|   105 |       20021 |    3 |    A   |
|   105 |       20021 |    1 |    B   |
|   106 |       20031 |    3 |    A   |
|   107 |       20101 |    4 |    A   |
|   107 |       20101 |    2 |    B   |
|   107 |       20101 |    2 |    B   |
|   108 |       20111 |    5 |    B   |
|   108 |       20111 |    1 |    B   |
|   108 |       20111 |    4 |    A   |
|   109 |       20131 |    3 |    A   |
|   109 |       20131 |    1 |    A   |
|   109 |       20131 |    2 |    B   |
+-------+-------------+------+--------+
删除后 EMP表应留有

输出

+-------+-------------+------+--------+
| EMPID | YEARQUARTER | TYPE | STATUS |
+-------+-------------+------+--------+
|   105 |       20021 |    3 |    A   |
|   106 |       20031 |    3 |    A   |
|   107 |       20101 |    4 |    A   |
|   108 |       20111 |    4 |    A   |
|   109 |       20131 |    3 |    A   |
|   109 |       20131 |    1 |    A   |
|   109 |       20131 |    2 |    B   |
+-------+-------------+------+--------+
我正在尝试使用

但是它给出了错误,并且没有显示期望的结果

DELETE e1
Emp e1
WHERE 
      E1.[type] IN (3,4)     
  AND  EXISTS (
                SELECT 
                    *
                FROM
                    Emp e2
                WHERE 
                        e1.EMPID = e2.EMPID
                    AND e1.yearquarter = e2.yearquarter
                    AND e2.[status] = 'A'
               )

可以为每个规则使用不同的子查询

declare @temp table (
EMPID    int,
YEARQUARTER   int,
[TYPE] int,
[STATUS] CHAR(1)
)

insert into @temp
select 105, 20021 ,   3 ,'A' union
select 105, 20021 ,   1 ,'B' union
select 106, 20031 ,   3 ,'A' union
select 107, 20101 ,   4 ,'A' union
select 107, 20101 ,   2 ,'B' union
select 107, 20101 ,   2 ,'B' union
select 108, 20111 ,   5 ,'B' union
select 108, 20111 ,   1 ,'B' union
select 108, 20111 ,   4 ,'A' union
select 109, 20131 ,   3 ,'A' union
select 109, 20131 ,   1 ,'A' union
select 109, 20131 ,   2 ,'B' 

delete from @temp 
where YEARQUARTER in (
    select 
        YEARQUARTER 
    from @temp 
    where [STATUS]='A' 
    and type in (3,4) 
    group by YEARQUARTER 
    HAVING COUNT(*) = 1
)
and YEARQUARTER not in (
    select 
        YEARQUARTER 
    from @temp 
    where [STATUS]='A' 
    group by YEARQUARTER 
    HAVING COUNT(*) > 1) 
and ([STATUS]<>'A' 
and type  not in (3,4))

select * from @temp

可以为每个规则使用不同的子查询

declare @temp table (
EMPID    int,
YEARQUARTER   int,
[TYPE] int,
[STATUS] CHAR(1)
)

insert into @temp
select 105, 20021 ,   3 ,'A' union
select 105, 20021 ,   1 ,'B' union
select 106, 20031 ,   3 ,'A' union
select 107, 20101 ,   4 ,'A' union
select 107, 20101 ,   2 ,'B' union
select 107, 20101 ,   2 ,'B' union
select 108, 20111 ,   5 ,'B' union
select 108, 20111 ,   1 ,'B' union
select 108, 20111 ,   4 ,'A' union
select 109, 20131 ,   3 ,'A' union
select 109, 20131 ,   1 ,'A' union
select 109, 20131 ,   2 ,'B' 

delete from @temp 
where YEARQUARTER in (
    select 
        YEARQUARTER 
    from @temp 
    where [STATUS]='A' 
    and type in (3,4) 
    group by YEARQUARTER 
    HAVING COUNT(*) = 1
)
and YEARQUARTER not in (
    select 
        YEARQUARTER 
    from @temp 
    where [STATUS]='A' 
    group by YEARQUARTER 
    HAVING COUNT(*) > 1) 
and ([STATUS]<>'A' 
and type  not in (3,4))

select * from @temp

因此,对于给定的YearQuarter,如果有且只有一行状态为“a”并键入3,4,则删除该YearQuarter的所有其他行?我们不应删除该行。您是否可以在一个YearQuarter中拥有多条状态为a且键入3或4的记录?这是一个错误。分享这个错误信息会有很大帮助。你错过了第2行的关键词;可能是这导致了错误?因此,对于给定的YearQuarter,如果有且只有一行状态为“a”并键入3,4,则删除该YearQuarter的所有其他行?我们不应删除该行。您是否可以在一个YearQuarter中拥有多条状态为a且键入3或4的记录?这是一个错误。分享这个错误信息会有很大帮助。你错过了第2行的关键词;也许这就是错误的原因?
+-------+-------------+------+--------+
| EMPID | YEARQUARTER | TYPE | STATUS |
+-------+-------------+------+--------+
|   105 |       20021 |    3 |   A    |
|   106 |       20031 |    3 |   A    |
|   107 |       20101 |    4 |   A    |
|   108 |       20111 |    4 |   A    |
|   109 |       20131 |    1 |   A    |
|   109 |       20131 |    2 |   B    |
|   109 |       20131 |    3 |   A    |
+-------+-------------+------+--------+