2015-08-20 46 views
0

我對SQL很陌生,我遇到了從表中刪除選定行的問題。SQL - 從數據庫中刪除選定的行

我寫了一個查詢,從表中選擇所需的行,但是當我嘗試執行DELETE FROM table_name WHERE EXISTS時,它會刪除數據庫中的所有行。

這裏是我完整的查詢:

DELETE FROM USR_PREF WHERE EXISTS (
    SELECT * 
    FROM USR_PREF 
    WHERE USR_PREF.USR_ID = 1 
     AND ((USR_PREF.SRV NOT IN (SELECT SEC_ENTITY_FOR_USR_ACTION_VIEW.ENTITYT_ID 
      FROM SEC_ENTITY_FOR_USR_ACTION_VIEW 
      WHERE SEC_ENTITY_FOR_USR_ACTION_VIEW.USR_ID = 1 
      AND SEC_ENTITY_FOR_USR_ACTION_VIEW.ENTITYTYP_CODE = 2 
      AND USR_PREF.DEVICE IS NULL) 

     OR (USR_PREF.DEVICE NOT IN (SELECT SEC_ENTITY_FOR_USR_ACTION_VIEW.ENTITYT_ID 
      FROM SEC_ENTITY_FOR_USR_ACTION_VIEW 
      WHERE SEC_ENTITY_FOR_USR_ACTION_VIEW.USR_ID = 1 
      AND SEC_ENTITY_FOR_USR_ACTION_VIEW.ENTITYTYP_CODE = 3))))) 

的選擇查詢返回所需的列,但DELETE命令只是刪除該整個表。

請協助。

+0

刪除過濾器顯示「如果有任何記錄符合以下條件,則刪除」您想說「刪除記錄與以下內容匹配的位置」。你可以刪除'WHERE EXISTS(SELECT * FROM USR_PREF'),它應該像預期的那樣工作 –

+0

有趣的是,你說它刪除了整個表。當我讀取查詢時,它應該在USR_PREF_T.USR_ID上得到一個錯誤,因爲USR_PREF_T '沒有定義 –

+0

@GordonLinoff 這只是一個語法錯誤,更正了它 –

回答

1

您的where子句WHERE EXISTS (SOME QUERY)是這裏的問題。你基本上是說「如果這個子查詢返回一個結果就刪除所有內容」。

您需要更加明確。也許是這樣的:

DELETE FROM USR_PREF 
WHERE USR_FIELD IN (
    SELECT USR_FIELD 
    FROM USR_PREF 
    WHERE USR_PREF_T.USER_ID=1 
     AND ((USR_PREF.SRV NOT IN ... 

等等...這樣,只有與您的子查詢中返回的記錄相匹配的記錄纔會被刪除。

+0

謝謝,它的工作! –