|
|
|
| Есть две таблицы, связанные между собой через Поле 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, все названия - латиницей | |
|
| |
|
|
|
| по-моему запрос на удаление по другому пишется, там только одна таблица, если таблицы связаны, то в другой само удалится | |
|
| |
|
|
|
| Delete from источник данных | |
|
| |
|
|
|
| DELETE Таблица1.*
FROM Таблица1 LEFT JOIN CONTENTS ON Таблица1.ПОле1=Таблица2.Поле1
WHERE (((Таблица2.Поле1) Is Null));
так тоже не работает :(
Сам запрос создаю непосредственно в Access. К сожалению, Visual Basic не владею | |
|
| |
|
|
|
| надо сначала удалить записи из связанной таблицы ко-многим
затем из основной
один-
Что бы ключ не с чем не был связан, тогда он удалится | |
|
| |
|
|
|
|
| если в сязи таблиц стоит галочка каскадное удаление связанных данных, то при удалении основной и связанные записи сами удалятся | |
|
| |
|
|
|
| Это я понимаю. Но суть запроса, который я пытаюсь создать, чтобы из основной таблицы (связь один-) удалялись записи, для которых нет связанных в подчиненной (-ко многим).
Я сначала вообще создал запрос Записи без подчиненных (он работает на ура), который потом преобразовал в Запрос на удаление (который выдает эту злосчастную ошибку). Больше всего меня добивает, что аналогичные запросы в этой же базе данных у меня давно работают, а тут ошибка и все (хотя возможно тут дело с ключами в таблицах или фиг знает). | |
|
| |
|
|
|
| Попробуйте DELETE DISTINCTROW ...
>Я сначала вообще создал запрос Записи без подчиненных (он работает на ура)
А, откыв такой запрос на экране, записи можно удалить/изменить?
Вы уверены, что связь 1-многие, а не многие-многие? | |
|
| |
|
|
|
| Ну если в схеме данных около Поля1 в Таблице 1 стоит символ 1, а возле аналогичного поля в Таблице 2 - символ бесконечности? Если это не означает тип связи, то не уверен.
Открыв на экране - ничего изменить нельзя (((( только просмотр
На зарубежном форуме нашел выход в виде такого запроса, но работает (хотя все же работает!) он достаточно туго (выполняется долго и ноут подвисает при его выполнении):
DELETE Таблица1.*
FROM Таблица1
WHERE [Таблица1].[Поле1] NOT IN (SELECT [Таблица2].[Поле1] FROM [Таблица2] GROUP BY [Таблица2].[Поле1]);
С подобными выражениями увы не сталкивался, просто тупо подставил таблицы под свою базу.
Если можно это как-то упростить, подскажите, плиз.
P.S. Спасибо всем за помощь, советы и участие) | |
|
| |
|
|
|
| Если на экране запрос можно только читать, значит он - необновляемый. Если он действительно построен на двух таблицах (а не таблице и необновляемом запросе), то желательно посмотреть на пример вашей БД с такими таблицами.
[Таблица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]); | |
|
| |
|
|
|
| [Таблица1].[Поле1] - просто уникальное. Поле обязательное, значения Null недопускаются, поскольку тип данных - счетчик, попросту говоря поле - код записи. В таблице сложный составной ключ.
БД сжимал.
По поводу DISTINCTROW - что это такое и с чем его едят? :) Никогда такой функции не использовал (уж, извините, за возможно глупые вопросы: я - самоучка, только азы Access изучали в вузе).
DELETE Таблица1.* FROM Таблица1
WHERE NOT EXISTS (SELECT [Таблица2].[Поле1] FROM [Таблица2] WHERE [Таблица2].[Поле1]=[Таблица1].[Поле1]);
|
УРА!!! ЗАРАБОТАЛО!!! БЫСТРО и ЛЕГКО!!!
Спасибо огромное. | |
|
| |
|
|
|
| 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));
|
| |
|
| |
|
|
|
| Да, запрос в конструкторе Access 2003. Ошибка о невозможности удаления записей в таблицах, по ссылке в Справке - код ошибки 3086 | |
|
| |
|
|
|
| А сюда прилепить файл с таблицами и запросом - можно? | |
|
| |