2017-02-23 93 views
0

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

Private Sub Form_Load() 

DoCmd.SetWarnings False 
DoCmd.RunSQL "UPDATE Table1 SET Field1 = Null WHERE EXISTS(SELECT * FROM Query2 WHERE Query2.Field2 = Table1.Field2 AND Query2.Field3 = 0 AND Query2.Field1 = Table1.Field1)" 
DoCmd.SetWarnings True 

End sub 

Другими словами, мне нужно проверить в Query2, в котором записывает field3 = 0 и среди этих записей, какие из них имеют Field1 соответствие Field1 из Table1 и Поле 2 соответствует полю 2 таблицы 1. Когда эти записи идентифицированы, я хочу установить значение записей Field1 в таблице 1 равным Null.

For example (i put in "code" aspect to have this part more readable, but it's not code, only an example) 

Table1.Field1 | Table1.Field2 
ABC    12345 
DEF    67891 

Query2.Field1 | Query2.Field2 | Query2.Field3 
ABC    12345   5   --> this record is not selected 
DEF    12345   0   --> this record is not selected 
DEF    67891   0   --> this record is selected and value of DEF in Table1 is deleted (Null) 

Вы видите ошибки? Вы видите какой-либо способ сделать это? я не знаю много о sql. Я надеюсь, что это достаточно ясно ...

Спасибо, Диана

+0

Сколько строк в этих таблицах (примерно)? –

+0

Похоже, это проблема с производительностью. Попробуйте сделать то же самое на таблицах с небольшим количеством строк, если он работает, прежде всего проверьте, индексированы ли все поля таблицы, используемые в 'WHERE' и' JOIN' во всех запросах. –

+0

Спасибо за ваш ответ. У меня есть 2000 записей в каждом. Я проверил индекс, одно поле не было проиндексировано. Я пробовал несколько записей, он работает. есть ли лучший способ сделать это? – Diane

ответ

0

Первое, что я хотел бы попробовать это изменить

WHERE EXISTS(SELECT * FROM Query2 WHERE Query2.Field2 

в

WHERE EXISTS(SELECT 1 FROM Query2 WHERE Query2.Field2 

В то время как в большинстве двигателей базы данных нет никакой разницы между ними, в Access это может иметь значение.

Надеюсь, это поможет.

EDIT:

Поскольку это не помогает, следующая вещь, которую я хотел бы попробовать это:

UPDATE Table1 
INNER JOIN Query2 ON Query2.Field2 = Table1.Field2 AND Query2.Field3 = 0 AND Query2.Field1 = Table1.Field1 
SET Table1.Field1 = Null; 

Пожалуйста, убедитесь, что вы запустите это на тестовой базе данных первой.

HTH.

+0

спасибо за ваш ответ. я протестировал это и не видел никаких улучшений, все еще очень долго. любая другая идея? – Diane

+0

Отредактировано, надеюсь, что это поможет –

0

Спасибо за помощь, я, наконец, сделали это по-другому, я не программист, поэтому, возможно, это не очень чистый, но это работает хорошо для моей цели :-)

я впервые изменил бит query2, чтобы ограничить до 2 условий Затем я экспортирую данные запроса в новую таблицу Затем я удаляю все записи, которые меня не интересуют Затем я обновляю таблицу1, используя оставшиеся записи (в конце концов, очень мало , поэтому запрос выполняется быстро). Больше шагов, но гораздо быстрее ...

Private Sub Form_Load() 
DoCmd.SetWarnings False 

'Append data of query2 to table2_temp 
DoCmd.OpenQuery "query2" 

'Delete some records in table table2_temp 
DoCmd.RunSQL "DELETE * FROM table2_temp WHERE table2_temp.field3 <> 0" 

'Delete value in field1 and field2 of table1 where field2 exists in table2_temp 
DoCmd.RunSQL "UPDATE table1 SET field1 = Null WHERE EXISTS(SELECT * FROM table2_temp WHERE table2_temp.field3 = table1.field2)" 


'Empty the temp table 
DoCmd.RunSQL "DELETE * FROM table2_temp" 

DoCmd.SetWarnings True 

End Sub