powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос в запросе работает неправильно, где ошибка?
6 сообщений из 6, страница 1 из 1
Запрос в запросе работает неправильно, где ошибка?
    #32766532
AndrewPoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожалуйста, может кто сталкивался и сможет помочь. Только, извините, предупреждаю - я начинающий, ругаться сразу не надо и попроще, пожалуйста. Существует вот такой запрос с подчиненным запросом на удаление записей из связанной таблицы:
DELETE [DCLHEAD XP old].G071, [DCLHEAD XP old].G072, [DCLHEAD XP old].G073
FROM [DCLHEAD XP old]
WHERE ((([DCLHEAD XP old].G071) In (SELECT [Новые ГТД].G071 FROM [Новые ГТД])) AND (([DCLHEAD XP old].G072) In (SELECT [Новые ГТД].G072 FROM [Новые ГТД])) AND (([DCLHEAD XP old].G073) In (SELECT [Новые ГТД].G073 FROM [Новые ГТД])))
WITH OWNERACCESS OPTION;
В результате запрос пытается удалить (выбрать -в данном случае это не важно) большее количество записей из DCLHEAD XP old чем их есть в Новые ГТД, а именно: если поле G073 совпадает то он данную запись удаляет (выбирает) при том что поля G071 и G072 не совпадают, то есть это другая запись. Одназначно запись определяется по трем полям G071, G072, G073. Получается что в результате запроса часть записей удаляется правильно - все три поля совпадали с "Новые ГТД" а часть нет - с "Новые ГТД" совпадало только поле G073. В чем глюк? Или я дурак?
База mdb, связанная таблица DCLHEAD XP old в которой должно происходить удаление тоже в базе mdb. Access2002 +SP3
...
Рейтинг: 0 / 0
Запрос в запросе работает неправильно, где ошибка?
    #32768788
AndrewPoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ау! Умные головы - неужели ни у кого никаких мыслей по данному поводу?
...
Рейтинг: 0 / 0
Запрос в запросе работает неправильно, где ошибка?
    #32768849
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewPoker Пожалуйста, может кто сталкивался и сможет помочь. Только, извините, предупреждаю - я начинающий, ругаться сразу не надо и попроще, пожалуйста. Существует вот такой запрос с подчиненным запросом на удаление записей из связанной таблицы:
DELETE [DCLHEAD XP old].G071, [DCLHEAD XP old].G072, [DCLHEAD XP old].G073
FROM [DCLHEAD XP old]
WHERE ((([DCLHEAD XP old].G071) In (SELECT [Новые ГТД].G071 FROM [Новые ГТД])) AND (([DCLHEAD XP old].G072) In (SELECT [Новые ГТД].G072 FROM [Новые ГТД])) AND (([DCLHEAD XP old].G073) In (SELECT [Новые ГТД].G073 FROM [Новые ГТД])))
WITH OWNERACCESS OPTION;
В результате запрос пытается удалить (выбрать -в данном случае это не важно) большее количество записей из DCLHEAD XP old чем их есть в Новые ГТД, а именно: если поле G073 совпадает то он данную запись удаляет (выбирает) при том что поля G071 и G072 не совпадают, то есть это другая запись. Одназначно запись определяется по трем полям G071, G072, G073. Получается что в результате запроса часть записей удаляется правильно - все три поля совпадали с "Новые ГТД" а часть нет - с "Новые ГТД" совпадало только поле G073. В чем глюк? Или я дурак?
База mdb, связанная таблица DCLHEAD XP old в которой должно происходить удаление тоже в базе mdb. Access2002 +SP3
ДЫк вы ж удаляете не по одновременному совпадению 3-х полей, а по наличию всех значений трех полей в различных выборках из [Новые ГТД]. В вашем случае по совпадению одновременно 3-х например:
Код: plaintext
1.
2.
3.
4.
5.
WHERE EXISTS(
  SELECT * FROM [Новые ГТД] AS g 
    WHERE [DCLHEAD XP old].G071=g.G071
       AND  [DCLHEAD XP old].G072=g.G072
       AND  [DCLHEAD XP old].G073=g.G073
)
...
Рейтинг: 0 / 0
Запрос в запросе работает неправильно, где ошибка?
    #32779958
AndrewPoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 - огромное персональное спасибо. Вы были абсолютно правы. Я задом то тоже чуйствую что именно так и происходит: удаляется не по одновременному совпадению 3-х полей, а по наличию всех значений трех полей в различных выборках из [Новые ГТД], а вот описать это условие одновременного совпадения не знал. Сделал как Вы подсказали:
DELETE Exists (SELECT * FROM [Новые ГТД] AS G WHERE [DCLHEAD XP old].G071 = G.G071 AND [DCLHEAD XP old].G072 = G.G072 AND [DCLHEAD XP old].G073 = G.g073) AS Выражение1, *
FROM [DCLHEAD XP old]
WHERE (((Exists (SELECT * FROM [Новые ГТД] AS G WHERE [DCLHEAD XP old].G071 = G.G071 AND [DCLHEAD XP old].G072 = G.G072 AND [DCLHEAD XP old].G073 = G.g073))<>False))
WITH OWNERACCESS OPTION;
Спасибо. Теперь работает правильно, удаляется то что надо и ничего лишнего. Но!!! Работает очень медленно. А нельзя как-либо сделать тоже самое, но быстрее. (Пожалуста, купить новый камень или увеличить ОЗУ не предлагать :-))))
...
Рейтинг: 0 / 0
Запрос в запросе работает неправильно, где ошибка?
    #32780396
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewPoker4321 - огромное персональное спасибо. Вы были абсолютно правы. Я задом то тоже чуйствую что именно так и происходит: удаляется не по одновременному совпадению 3-х полей, а по наличию всех значений трех полей в различных выборках из [Новые ГТД], а вот описать это условие одновременного совпадения не знал. Сделал как Вы подсказали:
DELETE Exists (SELECT * FROM [Новые ГТД] AS G WHERE [DCLHEAD XP old].G071 = G.G071 AND [DCLHEAD XP old].G072 = G.G072 AND [DCLHEAD XP old].G073 = G.g073) AS Выражение1, *
FROM [DCLHEAD XP old]
WHERE (((Exists (SELECT * FROM [Новые ГТД] AS G WHERE [DCLHEAD XP old].G071 = G.G071 AND [DCLHEAD XP old].G072 = G.G072 AND [DCLHEAD XP old].G073 = G.g073))<>False))
WITH OWNERACCESS OPTION;
Спасибо. Теперь работает правильно, удаляется то что надо и ничего лишнего. Но!!! Работает очень медленно. А нельзя как-либо сделать тоже самое, но быстрее. (Пожалуста, купить новый камень или увеличить ОЗУ не предлагать :-))))
пжалста, но ничо не понял
предлагал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
DELETE * FROM [DCLHEAD XP old]
WHERE EXISTS(
  SELECT * FROM [Новые ГТД] AS g 
    WHERE [DCLHEAD XP old].G071=g.G071
       AND  [DCLHEAD XP old].G072=g.G072
       AND  [DCLHEAD XP old].G073=g.G073
)
можно добавить индекс в [Новые ГТД]
(G071,G072,G073) - должно сильно поднять скоростенку.



если надо еще быстрее чем это - надо подумать. Но id-то хоть у [DCLHEAD XP old] какой никакой есть?
покумекайте над открытием двух рекордсетов:

1-й -
Код: plaintext
1.
2.
3.
4.
  SELECT [DCLHEAD XP old].id FROM [Новые ГТД] AS g, [DCLHEAD XP old] 
    WHERE [DCLHEAD XP old].G071=g.G071
       AND  [DCLHEAD XP old].G072=g.G072
       AND  [DCLHEAD XP old].G073=g.G073
)
(или его джойновый вариат - бывают вариации в скорости)
2-й - табличный (открывайте в базе-источнике)

[DCLHEAD XP old] , dbOpenTable,
.Index = "PrimaryKey" 'т.е. по id

и гоните по первому простым перебором - по второму - seek-ом + во втором делайте DELETE. Не думаю, что есть шансы обогнать джет, но вполне вероятно. (Exists он делает в каждом запросе, без индекса это долго)
...
Рейтинг: 0 / 0
Запрос в запросе работает неправильно, где ошибка?
    #32780561
ппп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты внимательно проверь. там тьма скобок может там быть ошибка.убери лишние.и проверь.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос в запросе работает неправильно, где ошибка?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]