2016-11-25 57 views
1

我使用此select語句查找了要刪除的重複行。雖然我只是改變了SELECT TO DELETE,它會刪除行,但它沒有。使用InnerJoin Firebird刪除聲明

這是select語句:

select * FROM MYCARD T1 
INNER JOIN(SELECT IDCARD, YEAR, MONEY FROM MYCARD GROUP BY IDCARD, YEAR, MONEY HAVING COUNT(IDCARD) > 1) T2 ON 
T1.IDCARD = T2.IDCARD AND T1.YEAR=T2.YEAR 
AND T1.MONEY = T2.MONEY 
WHERE T1.IDMONEY = 5 AND IDCARD=80 
AND ID not in (select min(ID) 
from MYCARD 
WHERE IDMONEY=5 
AND IDCARD=80 
group by IDCARD, YEAR); 

,我想用這個刪除:

DELETE FROM MYCARD T1 
INNER JOIN(SELECT IDCARD, YEAR, MONEY FROM MYCARD GROUP BY IDCARD, YEAR, MONEY HAVING COUNT(IDCARD) > 1) T2 ON 
T1.IDCARD = T2.IDCARD AND T1.YEAR=T2.YEAR 
AND T1.MONEY = T2.MONEY 
WHERE T1.IDMONEY = 5 AND IDCARD=80 
AND ID not in (select min(ID) 
from MYCARD 
WHERE IDMONEY=5 
AND IDCARD=80 
group by IDCARD, YEAR); 

但它不工作。有任何想法嗎?

我也試過這樣:

DELETE FROM MYCARD 
WHERE EXISTS (select * FROM MYCARD T1 
INNER JOIN(SELECT IDCARD, YEAR, MONEY FROM MYCARD GROUP BY IDCARD, YEAR, MONEY HAVING COUNT(IDCARD) > 1) T2 ON 
T1.IDCARD = T2.IDCARD AND T1.YEAR=T2.YEAR 
AND T1.MONEY = T2.MONEY 
WHERE T1.IDMONEY = 5 AND IDCARD=80 
AND ID not in (select min(ID) 
from MYCARD 
WHERE IDMONEY=5 
AND IDCARD=80 
group by IDCARD, YEAR)) 

回答

2

它不工作,因爲連接是不是Firebird delete syntax的一部分。

您需要使用刪除與存在,例如

delete from mycard t1 
where exists (
    <a correlated subquery to identify the rows to delete> 
) 

或類似的方式來識別記錄刪除。底線是:所有必要的邏輯都需要在where條款中。

給出的例子,你需要做的是這樣的:

DELETE FROM MYCARD T1 
WHERE T1.IDMONEY = 5 AND T1.IDCARD = 80 
AND EXISTS (
    SELECT IDCARD, YEAR, MONEY 
    FROM MYCARD T2 
    WHERE T2.IDCARD = T1.IDCARD 
    AND T2.YEAR = T1.YEAR 
    AND T2.MONEY = T1.MONEY 
    GROUP BY T2.IDCARD, T2.YEAR, T2.MONEY 
    HAVING COUNT(T2.IDCARD) > 1 
) 
AND T1.ID not in (
    select min(ID) 
    from MYCARD 
    WHERE IDMONEY = 5 
    AND IDCARD = 80 
    group by IDCARD, YEAR 
) 

您可能需要在選擇增加一個額外的AND T2.IDMONEY = 5的存在(除非moneyidmoney是一樣的)。

+0

但是,當我把我的select語句存在的地方,它仍然不起作用 – ktos1234

+0

@ ktos1234請用你試過的語句更新你的問題。 –

+0

我修改了我的帖子 – ktos1234

相關問題