Оператор SQL, удаляющий всю таблицу - PullRequest
2 голосов
/ 23 декабря 2011

У меня есть две таблицы, каждая из которых имеет идентификационный номер, которые связаны между собой (AllUsers и AllProfiles).Когда пользователь нажимает кнопку, я хочу, чтобы таблица AllUsers проверила наличие идентификаторов, которых нет в таблице AllProfiles, и удалила их.Я новичок в SQLCE и взломал это вместе.Проблема в том, что он удаляет всю таблицу целиком.Почему?

DELETE FROM AllUsers
WHERE  EXISTS
    (SELECT       ID
     FROM         AllUsers
     WHERE        (ID NOT IN
                     (SELECT ID
                        FROM AllProfiles)))

Кроме того, это эффективный способ массового удаления тысяч записей?Я попробовал DeleteAllOnSubmit Линка, но это было слишком медленно.Я надеюсь, что вышеизложенное сравнивает две таблицы напрямую, это должно быть эффективно.(Я не хочу использовать каскадирование, так как мне нужен контроль над каждой таблицей отдельно)

EDIT - оператор SELECT корректно возвращает отсутствующие идентификаторы, поэтому с частью DELETE FROM AllUsers WHERE EXISTS что-то не так.*

1 Ответ

1 голос
/ 23 декабря 2011

Вы в основном говорите

delete from allusers
where TRUE -- this is pseudo, but you get the idea

Ваш исходный запрос удаляет всю таблицу, потому что единственным условием является логическое значение ... если это возвращает данные, то оно удалит все данные. Если ваше предложение exists не возвращает данные, оно не будет удалять никакие данные.

Вы хотите что-то вроде этого (я не владею CE, но вы должны быть в состоянии внести незначительные изменения, если он не переносится на 100% в CE):

delete from allusers
where id not in
(
    select id
    from allprofiles
)
...