2011-12-23 2 views
2

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

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

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

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

ответ

1

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

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

Я ненавижу, используя В. Может ли SQL-CE использовать EXISTS? – MatBailie

+0

@Dems Почему вы ненавидите 'IN' ??! :) Что касается SQL CE, я не могу сказать в любом случае. Я бы солгал, если бы сказал, что я эксперт по SQL CE (или даже слегка стих в нем). –

+0

Он часто менее оптимизирован, чем альтернативы. И чрезмерно используется людьми, которые не могут присоединиться. И заставляет людей попробовать 'IN (@comma_delimited_string_of_chaff)'. И иногда ограничивается максимальным размером набора данных. И это просто не perrrrrrrty. – MatBailie

Смежные вопросы