Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2011, 16:55   #1
NIKOLASCS
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 17
Вопрос Запрос на удаление

Как правильно написать запрос на удаление. Ругается на Full:

Код:
Delete FROM  DevicesDict  
 FULL OUTER JOIN Customers 
 INNER JOIN Cust ON Customers.CustomerID = Cust.CustomerID 
 INNER JOIN Devices ON Customers.CustomerID = Devices.CustomerID 
 INNER JOIN bypass_sheet_item ON Customers.CustomerID = bypass_sheet_item.CustomerID 
 INNER JOIN bypass_sheet ON bypass_sheet_item.SheetID = bypass_sheet.SheetID ON DevicesDict.DeviceDictID = Devices.DeviceDictID 
WHERE (bypass_sheet_item.BypassDate <= CONVERT(DATETIME, '2011-03-31 00:00:00', 102)) 
 AND (bypass_sheet_item.BypassDate >= CONVERT(DATETIME, '2011-03-01 00:00:00', 102)) 
 AND Cust.CustomerID = Devices.CustomerID and DevicesDict.Type is Null  
ORDER BY devices.DeviceID

Последний раз редактировалось Stilet; 24.08.2011 в 18:55.
NIKOLASCS вне форума Ответить с цитированием
Старый 24.08.2011, 18:56   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

ХЫ... А ты че тупо заменил Select в команде и думаешь что тебе каскадное удаление пройдет? Я почему-то оч. уверен что стандартом DELETE такие присоединения не поддерживаются.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.08.2011, 08:30   #3
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Никто из авторов не хочет признаваться в какой СУБД у него проблемы.
Судя по некоторым деталям запроса, предположим, что это MS SQL Server. Правда, все равно непонятно какой версии.

Допустим, что это так. Если бы автор темы дал себе труд посмотреть справку по предложению DELETE,
то увидел бы, что информация из других таблиц, на которой основываются удаления в упомянутой, должны указываться после второго аргумента (оператора) FROM.
Прик вне форума Ответить с цитированием
Старый 25.08.2011, 08:49   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

если Виталий прав, и это попытка сделать запрос на удаление для записей, которые отбираются через SELECT
тогда возможно сработает такой вариант:

Внимание!
Два важных замечания.
1) В таблице DevicesDict поле DeviceDictID должно быть первичным ключом (если это поле таким не является, замените в запросе на то поле, которое ключом является
2) на удаляемые записи в таблице DevicesDict не должно быть ссылок, либо должно быть включено каскадное удаление для всех foreign keys


Код:
Delete FROM  DevicesDict
where DeviceDictID in
(select DD.DeviceDictID from DevicesDict DD
 FULL OUTER JOIN Customers 
 INNER JOIN Cust ON Customers.CustomerID = Cust.CustomerID 
 INNER JOIN Devices ON Customers.CustomerID = Devices.CustomerID 
 INNER JOIN bypass_sheet_item ON Customers.CustomerID = bypass_sheet_item.CustomerID 
 INNER JOIN bypass_sheet ON bypass_sheet_item.SheetID = bypass_sheet.SheetID ON DD.DeviceDictID = Devices.DeviceDictID 
WHERE (bypass_sheet_item.BypassDate <= CONVERT(DATETIME, '2011-03-31 00:00:00', 102)) 
 AND (bypass_sheet_item.BypassDate >= CONVERT(DATETIME, '2011-03-01 00:00:00', 102)) 
 AND Cust.CustomerID = Devices.CustomerID and DD.Type is Null )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.08.2011, 09:48   #5
NIKOLASCS
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 17
Вопрос

Вы правы, в DevicesDict поле DeviceDictID является первичным ключом.
Подскажите, как определить наличие ссылок на удаляемые записи в таблице DevicesDict?
NIKOLASCS вне форума Ответить с цитированием
Старый 25.08.2011, 09:59   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Подскажите, как определить наличие ссылок на удаляемые записи в таблице DevicesDict?
может быть, Вам проще включить каскадное удаление?

Чтобы определить наличие ссылок на удаляемые записи, нужно знать структуру таблицы и как они взаимосвязаны.
например, уже даже из запроса видно, что у Вас в таблице Devices есть ссылка (foreign key) на таблицу DevicesDict (на DeviceDictID)

Если каскадное удаление по каким-то причинам включать нельзя или нежелательно, тогда, боюсь, что одним запросом задачу не решить...
если это MS SQL - я бы предложил сделать хранимую процедуру.
Там запросом вытащить DeviceDictID в табличную переменную,
потом
Код:
DELETE FROM Device where  Devices.DeviceDictID in (select  DeviceDictID from @RecForDelete);

... тут ещё удалить из всех таблиц, где есть ссылки на DevicesDict

DELETE FROM DevicesDict where  DevicesDict.DeviceDictID in (select DeviceDictID from @RecForDelete);
p.s. Пример кода писан условный...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.08.2011, 10:11   #7
NIKOLASCS
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 17
Вопрос

Как включить в запрос каскадное удаление. Покажите пример.
NIKOLASCS вне форума Ответить с цитированием
Старый 25.08.2011, 10:25   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Как включить в запрос каскадное удаление.
если не ошибаюсь, то это включается не в запрос, а при создании связи между таблицами.

и второе, может быть, Вы уже откроете нам тайну - какая у Вас СУБД ?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.08.2011, 14:15   #9
NIKOLASCS
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 17
Вопрос

Стоит SQL 2000.

Предложенный запрос удаляет все записи из таблицы DevicesDict, условие DD.Type is Null не выполняется. Можете объяснить?
NIKOLASCS вне форума Ответить с цитированием
Старый 25.08.2011, 15:45   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Предложенный запрос удаляет все записи из таблицы DevicesDict, условие DD.Type is Null не выполняется. Можете объяснить?
нет. я не только не могу такое объяснить, я даже считаю, что такое в принципе невозможно!
Если DeviceDictID является уникальным полем (первичным ключом), разумеется!

попытаемся разобраться...
Вы знаете, сколько записей у Вас удаляется?

Тогда попробуйте такой запрос:
Код:
select DD.DeviceDictID, DD.Type from DevicesDict DD
 FULL OUTER JOIN Customers 
 INNER JOIN Cust ON Customers.CustomerID = Cust.CustomerID 
 INNER JOIN Devices ON Customers.CustomerID = Devices.CustomerID 
 INNER JOIN bypass_sheet_item ON Customers.CustomerID = bypass_sheet_item.CustomerID 
 INNER JOIN bypass_sheet ON bypass_sheet_item.SheetID = bypass_sheet.SheetID ON DD.DeviceDictID = Devices.DeviceDictID 
WHERE (bypass_sheet_item.BypassDate <= CONVERT(DATETIME, '2011-03-31 00:00:00', 102)) 
 AND (bypass_sheet_item.BypassDate >= CONVERT(DATETIME, '2011-03-01 00:00:00', 102)) 
 AND Cust.CustomerID = Devices.CustomerID and DD.Type is Null
посмотрите, сколько он выбрал записей (количество должно ТОЧНО совпасть с тем количеством, которое удаляется)...

посмотрите, если ли среди выбранных записей те, где DD.Type заполнено значением (т.е. условие DD.Type is null) не выполняется...

п.с. можно, конечно, данное условие отбора продублировать через AND во внешнем запросе (который delete from ..)
но в данном случае, я бы рекомендовал Вам разобраться в причинах подобного поведения (я лично считаю, что Вы чего-то не учитываете или ошибочно считаете, что удаляются не те записи, что выбираются во внутреннем запросе).

п.п.с. если есть "незанятое" поле в таблице DevicesDict (или есть возможность изменить структуру добавив туда такое поле временно, для отладки).
тогда можно вместо DELETE from выполнить команду
UPDATE DevicesDict set ReservedField = 1 where where DeviceDictID in (select DD.DeviceDictID ......
а потом посмотреть, какие записи "пометились" единичкой...

вообще так, отлаживать на расстоянии достаточно проблематично. Может быть у Вас на таблице триггер какой-нибудь висит, который и создаёт подобные проблемы...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос на добавление\удаление Stelix Microsoft Office Access 0 24.12.2010 12:41
Вложенный запрос на удаление конкретной записи Droid БД в Delphi 1 03.08.2010 17:47
Запрос на удаление JustinDEbass Microsoft Office Access 7 11.04.2010 08:15
Запрос на удаление с условием Dimok82 SQL, базы данных 1 13.03.2009 18:19
запрос на удаление ГОСЕАН Помощь студентам 9 13.08.2008 10:03