2009-05-26 6 views
1

У меня проблема с sql в ms-доступе. им с помощью этого кода:ms-access: ошибка времени выполнения 3354

SELECT readings_miu_id, ReadDate, ReadTime, RSSI, Firmware, Active, OriginCol, ColID, Ownage, SiteID, PremID, prem_group1, prem_group2 
INTO analyzedCopy2 
FROM analyzedCopy AS A 
WHERE ReadTime = (SELECT TOP 1 analyzedCopy.ReadTime FROM analyzedCopy WHERE analyzedCopy.readings_miu_id = A.readings_miu_id AND analyzedCopy.ReadDate = A.ReadDate ORDER BY analyzedCopy.readings_miu_id, analyzedCopy.ReadDate, analyzedCopy.ReadTime) 
ORDER BY A.readings_miu_id, A.ReadDate ; 

и до этого я буду заполнять таблицы analyzedCopy из других таблиц при выполнении определенных критериев. для одного набора критериев этот код работает очень хорошо, но для других он продолжает давать мне ошибку времени выполнения «3354». единственное отличие, которое я вижу, это то, что с критериями, которые работают, таблица составляет около 4145 записей, где, как и с критериями, которые не работают, таблица, в которой им используется этот код, составляет более 9000 записей. какие-либо предложения?

есть ли способ сказать, чтобы он только вытащил половину информации, а затем запустил ту же строку выбора на другой половине таблицы im, которую вытащили, и добавьте эти результаты к предыдущим результатам из первой половины?

Полный текст для ошибки времени выполнения «3354» заключается в том, что это «В этом подзапросе может быть возвращено не более одной записи».

Я просто попытался запустить этот запрос в первых 4000 записях, и он снова сработал с тем же кодом ошибки, поэтому он не может быть массивом записей, которые я бы мог подумать.

+0

Что такое ошибка времени выполнения 3354? – JeffO

ответ

5

Смотреть это:

http://allenbrowne.com/subquery-02.html#AtMostOneRecord

Что происходит ваша подзапрос возвращает два идентичных записей (на основе ORDER BY) и TOP 1 фактически возвращает две записи (да, это как доступ делает TOP заявление). Вам нужно добавить поля в ORDER BY, чтобы сделать его уникальным - предпочтительнее уникальный идентификатор (у вас есть уникальный PK, не так ли?)

Как указано Andomar ниже DISTINCT TOP 1 будет работать.

+0

no У меня нет уникального первичного ключа в этой таблице, но я могу вытащить поле из других таблиц, которые являются уникальными, я пытаюсь решить это решение, но мне просто пришлось перезагрузить мой компьютер, потому что он продолжает работать «НЕ ОТКАЗЫВАЕТСЯ» «когда я пытаюсь запустить его. его довольно раздражает, надеюсь, перезагрузка позаботится об этой проблеме. – Bryan

+1

У вас должны быть уникальные ПК на всех таблицах - даже временные/рабочие таблицы - они сохраняли этот день много раз - вы никогда не знаете, когда вам может понадобиться ссылаться на определенную строку. –

+0

это сработало для меня, спасибо. и это действительно раздражает, что команда TOP 1 !!!!!!!!!!!!!! может вернуть две вещи. в любом случае спасибо за помощь и информацию – Bryan

0

Я не знаю, будет ли это работать или нет (и у меня больше нет копии доступа к тесту), поэтому я прошу прощения, если я уйду.

Во-первых, просто выберите первичный ключ для анализаCopy, чтобы получить идентификатор средней точки. Что-то вроде:

SELECT TOP 4500 readings_miu_id FROM analyzedCopy ORDER BY readings_miu_id, ReadDate; 

Затем, когда у вас есть середина точки ID, вы можете добавить, что в заявлении WHERE вашего первоначального заявления:

SELECT ... 
INTO ... 
FROM ... 
WHERE ... AND (readings_miu_id <= {ID from above} 
ORDER BY ... 

Затем выберите другую половину:

SELECT ... 
INTO ... 
FROM ... 
WHERE ... AND (readings_miu_id > {ID from above} 
ORDER BY ... 

Снова, извините, если я уйду.

2

Что возвращает MS-ACCESS при запуске подзапроса?

SELECT TOP 1 analyzedCopy.ReadTime 
FROM analyzedCopy 
WHERE analyzedCopy.readings_miu_id = A.readings_miu_id 
AND analyzedCopy.ReadDate = A.ReadDate 
ORDER BY analyzedCopy.readings_miu_id, analyzedCopy.ReadDate, 
     analyzedCopy.ReadTime 

Если она возвращает несколько строк, может быть, это может быть исправлено с DISTINCT:

SELECT DISTINCT TOP 1 analyzedCopy.ReadTime 
FROM ... rest of query ... 
+0

Хорошая идея. Работает на меня. – Fionnuala

Смежные вопросы