2015-08-20 44 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

谢谢,它的工作! –