2009-05-26 8 views
1

Je rencontre un problème lors de l'exécution d'un sql en ms-access. im en utilisant ce code:ms-access: erreur d'exécution 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 ; 

et avant cela, je suis remplir le tableau analyzedCopy d'autres tableaux donnés à certains critères. pour un ensemble de critères, ce code fonctionne très bien, mais pour d'autres, il continue à me donner une erreur d'exécution '3354'. la seule différence que je peux voir est qu'avec les critères qui fonctionnent, la table est autour de 4145 enregistrements longs où comme avec les critères qui ne fonctionne pas la table que im utilisant ce code sur est plus de 9000 enregistrements de long. Aucune suggestion?

est-il possible de dire à tirer seulement la moitié de l'information, puis exécutez la même chaîne de sélection sur l'autre moitié de la table im tirant à partir et ajouter ces résultats aux résultats précédents de la première moitié?

Le texte complet pour l'erreur d'exécution '3354' est qu'il est "Au plus un enregistrement peut être retourné par cette sous-requête." J'ai juste essayé d'exécuter cette requête sur les 4000 premiers enregistrements et il a échoué encore avec le même code d'erreur ainsi il ne peut pas être le montant d'enregistrements je penserais.

+0

Quelle est l'erreur d'exécution 3354? – JeffO

Répondre

5

Voir ceci:

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

Ce qui se passe est votre sous-requête retourne deux enregistrements identiques (en fonction de la ORDER BY) et le TOP 1 retourne en fait deux disques (oui voilà comment l'accès fait le TOP déclaration). Vous devez ajouter des champs à ORDER BY pour le rendre unique - préférablement un ID unique (vous avez un PK unique, n'est-ce pas?)

Comme indiqué ci-dessous, DISTINCT TOP 1 fonctionnera également.

+0

non je n'ai pas de clé primaire unique dans cette table mais je peux tirer un champ des autres tables qui est unique, j'essaie cette solution mais j'ai juste dû redémarrer mon ordi parce que l'accès continue à "NE PAS RÉPONDRE" "Quand j'essaie de l'exécuter. C'est plutôt ennuyeux, j'espère que le redémarrage prendra soin de ce problème. – Bryan

+1

Vous devriez avoir des PK uniques sur toutes les tables - même les tables temporaires/de travail - elles ont sauvé le jour plusieurs fois - vous ne savez jamais quand vous pourriez avoir besoin de se référer à une rangée particulière. –

+0

cela a fonctionné pour moi, merci. et c'est vraiment énervant que la commande TOP 1 !!!!!!!!!!!!!! peut retourner deux choses. de toute façon merci pour l'aide et l'info – Bryan

0

Je ne sais pas si cela fonctionnerait ou non (et je n'ai plus de copie d'Access à tester), alors je m'excuse d'avance si je suis loin. Tout d'abord, faites simplement une sélection sur la clé primaire de analysisCopy pour obtenir l'ID du point milieu. Quelque chose comme:

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

Ensuite, lorsque vous avez l'ID point milieu, vous pouvez l'ajouter à la clause WHERE de votre déclaration originale:

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

Sélectionnez ensuite l'autre moitié:

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

Encore une fois, désolé si je suis loin.

2

Que retourne MS-ACCESS lorsque vous exécutez la sous-requête?

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 

Si elle retourne plusieurs lignes, peut-être il peut être fixé Distinct:

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

Bonne idée. Travaille pour moi. – Fionnuala