Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрос на удаление (Ошибка 3086)
 
 автор: Demon   (24.01.2009 в 13:24)   личное сообщение
 
 

Есть две таблицы, связанные между собой через Поле 1. Тип связи - "один-ко-многим".
Создаю запрос для удаления данных из Таблицы 1 (Поле 1 для нее уникально), в случае если в Таблице 2 подчиненные данные отсутствуют.
Запрос в виде SQL:
DELETE Таблица1.*, Таблица2.Поле1
FROM Таблица1 LEFT JOIN Таблица2 ON Таблица1.Поле1 = Таблица2.Поле1
WHERE (((Таблица2.Поле1) Is Null));

В итоге выдает:
Невозможно удаление записей из указанных таблиц. (Ошибка 3086)
Не удается завершить удаление данных из одной или нескольких таблиц.

Возможные причины:

Отсутствуют разрешения на изменение таблицы. Для изменения разрешений обратитесь к системному администратору или создателю таблицы.
База данных была открыта только для чтения. База данных может оказаться доступной только для чтения по одной из следующих причин:
Для открытия базы данных с доступом только для чтения был использован метод OpenDatabase.
Файл базы данных определен с доступом только для чтения в операционной системе сервера базы данных или в сети.

P.S. База данных - с монопольным доступом. Другие запросы на удаление - работают,
правда там нет привязки "один-ко-многим", пробовал убрать тип - результат тот же :(
Подскажите, что можно сделать, чтобы уйти от этой ошибки. THNX

P.P.S. Версия Access 2003, все названия - латиницей

  Ответить  
 
 автор: Ми   (24.01.2009 в 13:42)   личное сообщение
 
 

по-моему запрос на удаление по другому пишется, там только одна таблица, если таблицы связаны, то в другой само удалится

  Ответить  
 
 автор: Ми   (24.01.2009 в 13:46)   личное сообщение
 
 

Delete from источник данных

  Ответить  
 
 автор: Demon   (24.01.2009 в 13:50)   личное сообщение
 
 

DELETE Таблица1.*
FROM Таблица1 LEFT JOIN CONTENTS ON Таблица1.ПОле1=Таблица2.Поле1
WHERE (((Таблица2.Поле1) Is Null));

так тоже не работает :(

Сам запрос создаю непосредственно в Access. К сожалению, Visual Basic не владею

  Ответить  
 
 автор: час   (24.01.2009 в 14:14)   личное сообщение
 
 

надо сначала удалить записи из связанной таблицы ко-многим
затем из основной
один-

Что бы ключ не с чем не был связан, тогда он удалится

  Ответить  
 
 автор: Ми   (24.01.2009 в 14:45)   личное сообщение
 
 

VB здесь не причём

  Ответить  
 
 автор: Ми   (24.01.2009 в 14:49)   личное сообщение
 
 

если в сязи таблиц стоит галочка каскадное удаление связанных данных, то при удалении основной и связанные записи сами удалятся

  Ответить  
 
 автор: Demon   (24.01.2009 в 15:00)   личное сообщение
 
 

Это я понимаю. Но суть запроса, который я пытаюсь создать, чтобы из основной таблицы (связь один-) удалялись записи, для которых нет связанных в подчиненной (-ко многим).
Я сначала вообще создал запрос Записи без подчиненных (он работает на ура), который потом преобразовал в Запрос на удаление (который выдает эту злосчастную ошибку). Больше всего меня добивает, что аналогичные запросы в этой же базе данных у меня давно работают, а тут ошибка и все (хотя возможно тут дело с ключами в таблицах или фиг знает).

  Ответить  
 
 автор: Анатолий (Киев)   (26.01.2009 в 11:39)   личное сообщение
 
 

Попробуйте DELETE DISTINCTROW ...

>Я сначала вообще создал запрос Записи без подчиненных (он работает на ура)
А, откыв такой запрос на экране, записи можно удалить/изменить?
Вы уверены, что связь 1-многие, а не многие-многие?

  Ответить  
 
 автор: Demon   (26.01.2009 в 21:18)   личное сообщение
 
 

Ну если в схеме данных около Поля1 в Таблице 1 стоит символ 1, а возле аналогичного поля в Таблице 2 - символ бесконечности? Если это не означает тип связи, то не уверен.
Открыв на экране - ничего изменить нельзя (((( только просмотр

На зарубежном форуме нашел выход в виде такого запроса, но работает (хотя все же работает!) он достаточно туго (выполняется долго и ноут подвисает при его выполнении):

DELETE Таблица1.*
FROM Таблица1
WHERE [Таблица1].[Поле1] NOT IN (SELECT [Таблица2].[Поле1] FROM [Таблица2] GROUP BY [Таблица2].[Поле1]);

С подобными выражениями увы не сталкивался, просто тупо подставил таблицы под свою базу.
Если можно это как-то упростить, подскажите, плиз.

P.S. Спасибо всем за помощь, советы и участие)

  Ответить  
 
 автор: Анатолий (Киев)   (27.01.2009 в 11:06)   личное сообщение
 
 

Если на экране запрос можно только читать, значит он - необновляемый. Если он действительно построен на двух таблицах (а не таблице и необновляемом запросе), то желательно посмотреть на пример вашей БД с такими таблицами.
[Таблица1].[Поле1] - ключевое или просто уникальное? Если 2-й вариант, то в свойствах индекса зачения Null игнорируются? Вообще это поле обязательное?
DISTINCTROW пробовали?
БД сжимали?

Что касается примера с импортного сайта, то это - применение подчиненного запроса в критерии отбора. Возможно будет быстрее, если убрать из него GROUP BY [Таблица2].[Поле1]
Такой вариант всегда работает медленнее, чем с LEFT JOIN (а, по логике, ваш исходный запрос должен работать) , т.к. не используются индексы со стороны "многие". Обычно применяется, если критерием служит необновляемый запрос.
Попробуйте еще так:
DELETE Таблица1.* FROM Таблица1
WHERE NOT EXISTS (SELECT [Таблица2].[Поле1] FROM [Таблица2] WHERE [Таблица2].[Поле1]=[Таблица1].[Поле1]);

  Ответить  
 
 автор: Demon   (27.01.2009 в 20:38)   личное сообщение
 
 

[Таблица1].[Поле1] - просто уникальное. Поле обязательное, значения Null недопускаются, поскольку тип данных - счетчик, попросту говоря поле - код записи. В таблице сложный составной ключ.
БД сжимал.
По поводу DISTINCTROW - что это такое и с чем его едят? :) Никогда такой функции не использовал (уж, извините, за возможно глупые вопросы: я - самоучка, только азы Access изучали в вузе).


DELETE Таблица1.* FROM Таблица1
WHERE NOT EXISTS (SELECT [Таблица2].[Поле1] FROM [Таблица2] WHERE [Таблица2].[Поле1]=[Таблица1].[Поле1]);



УРА!!! ЗАРАБОТАЛО!!! БЫСТРО и ЛЕГКО!!!
Спасибо огромное.

  Ответить  
 
 автор: osmor   (26.01.2009 в 09:11)   личное сообщение
 
 

DELETE Таблица1.*
FROM Таблица1 LEFT JOIN CONTENTS ON Таблица1.ПОле1=Таблица2.Поле1
WHERE (((Таблица2.Поле1) Is Null));



Этот запрос вы создали в конструкторе ACCESS 2003 ????
Вы ничего не путаете? Какое сообщение об ошибке выдается при выполнении этого запроса?

Такой запрос работает?

DELETE Таблица1.*
FROM Таблица1 LEFT JOIN ON Таблица1.ПОле1=Таблица2.Поле1
WHERE (((Таблица2.Поле1) Is Null));

  Ответить  
 
 автор: Demon   (26.01.2009 в 21:08)   личное сообщение
 
 

Да, запрос в конструкторе Access 2003. Ошибка о невозможности удаления записей в таблицах, по ссылке в Справке - код ошибки 3086

  Ответить  
 
 автор: час   (28.01.2009 в 13:20)   личное сообщение
 
 

А сюда прилепить файл с таблицами и запросом - можно?

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList