2017-08-30 57 views
1

規則:如果在Yearquarter中有多個行(3,4),status ='a'和type = 1且status ='a'保持類型= 1,狀態=「A」 yearquarter爲employerid,其餘應刪除按規則刪除表中的記錄

內這是表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) 
       ) 

執行此操作後,表中的所有行都被刪除。

+3

不需要像這樣使用大寫鎖定。 – jarlh

回答

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' 
       ) 
+0

請注意,我已更新答案,因爲它沒有檢查E2上的行必須是類型1。 –

0

@Somasekhar Ghanta,

爲您的要求的解決方案是

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

還要注意的是你的輸出有1個ROW與類型4和狀態答: 107 20101 4甲

另外照顧大小寫的狀態。

+0

我認爲它有不正確的語法 –

+0

是的,有錯別字。更新。請檢查恢復。 – IOTEnthu

+0

在刪除類型3和4之前,此語句不檢查類型1和狀態A是否已存在。 –