从规则

时间:2017-08-30 09:06:24

标签: sql sql-server

规则:在年份中,如果有多行类型(3,4),状态=' a'和type = 1,状态=' a'对于雇主,我们需要保持type = 1状态=' a'在雇主的年度内,其余部分应删除

这是表格EMP

EMPID    YEARQUARTER   TYPE   STATUS
105        20021        3       A
105        20021        1       A
106        20091        4       A
106        20091        1       A
107        20101        4       A
107        20101        1       B
107        20101        2       A
108        20111        3       A
108        20111        1       A
108        20111        2       B
109        20131        3       A
109        20131        1       A
109        20131        1       A

删除后,EMP表应保留:

EMPID    YEARQUARTER   TYPE   STATUS
105        20021        1       A
106        20091        1       A
107        20101        4       A
107        20101        1       B
107        20101        2       A
108        20111        1       A
108        20111        2       B
109        20131        1       A
109        20131        1       A

我试图使用此声明,但它没有获得所需的结果。

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

执行此操作后,表中的所有行都将被删除。

2 个答案:

答案 0 :(得分:1)

您应该检查是否要删除E1数据集上的类型3和4,而不是E2数据集。

DELETE E1
FROM
    EMP E1
WHERE 
      E1.TYPE IN (3,4)      
  AND E1.STATUS = 'A'
  AND EXISTS (
                SELECT 
                    *
                FROM
                    EMP E2
                WHERE 
                        E2.EMPID = E1.EMPID
                    AND E2.YEARQUARTER = E1.YEARQUARTER
                    AND E2.TYPE = 1
                    AND E2.STATUS = 'A'
               )

答案 1 :(得分:0)

@Somasekhar Ghanta,

您的要求的解决方案是

 DELETE  FROM Yearquarter AS tbl WHERE tbl.TYPE IN(3,4) AND tbl.Status = 'a'

另请注意,您的OUTPUT有1行,类型4和状态A: 107 20101 4 A

还要注意状态的大小写。