2009-05-22 4 views
1

J'ai presque terminé avec cela, juste quelques derniers hiccups. J'ai maintenant besoin de supprimer tous les enregistrements d'une table, sauf pour le top 1 où readings_miu_id est la colonne "DISTINCT". En d'autres termes, j'ai besoin de supprimer tous les enregistrements d'une table autre que le premier DISTINCT readings_miu_id. Je suppose tout ce que je dois faire est modifier l'instruction de suppression de base:MS-ACCESS: Suppression de toutes les lignes à l'exception du top 1 et mise à jour d'une table à partir d'une requête

DELETE FROM analyzedCopy2 
WHERE readings_miu_id = some_value 

Mais je ne peux pas comprendre comment changer la some_column = partie some_value à quelque chose comme:

where some_column notequal to (select top 1 from analyzedCopy2 as A 
where analyzedCopy2.readings_miu_id = A.readings_miu_id) 

puis J'ai besoin de comprendre comment utiliser une instruction UPDATE pour mettre à jour une table (analyticalCopy2) à partir d'une requête (où toutes les valeurs que je veux stocker dans la colonne RSSI dans la table analyzeCopy2 sont actuellement localisées). J'ai essayé ceci:

UPDATE analyzedCopy2 from testQuery3 SET analyzedCopy2.RSSI = 
(select AvgOfRSSI from testQuery3 INNER JOIN analyzedCopy2 on analyzedCopy2.readings_miu_id = testQuery3.readings_miu_id where analyzedCopy2.readings_miu_id = testQuery3.readings_miu_id) 
where analyzedCopy2.readings_miu_id = testQuery3.readings_miu_id 

mais apparemment je ne peux pas utiliser FROM à l'intérieur d'une instruction de mise à jour. Des pensées? Je suis sûr que je vais à ce sujet un moyen très non standard (et peut-être même si ce n'est probablement pas le mauvais plat), mais je ne suis pas autorisé à utiliser vb.net2008 pour tirer et manipuler puis stocker les données comme Je voudrais donc être coincé en utilisant des instructions sql dans ms-access ce qui est une bonne expérience d'apprentissage (même si essayer de faire des choses bizarres comme je l'ai fait dans les instructions sql me fait battre la tête contre ma plate-forme au sens figuré bien sûr)

Répondre

4

MS Access UPDATE Les instructions sql ne peuvent pas référencer les requêtes, mais elles peuvent référencer des tables. Donc, la chose à faire est de stocker les résultats de la requête dans une table.

SELECT YourQuery.* 
INTO TempTable1 
FROM YourQuery 

Maintenant, vous pouvez utiliser TempTable1 dans une requête UPDATE:

UPDATE TargetTable 
INNER JOIN TempTable1 ON TempTable1.TargetTableId = TargetTable.Id 
SET TargetTable.TargetField = TempTable1.SourceField 

Voir my answer to this question.

+0

yay !!, merci. qui a fonctionné pour cette partie maintenant je dois soit comprendre comment supprimer toutes les lignes (enregistrements) de analyzeCopy2 qui ne sont pas le premier distinct readings_miu_id ou comprendre comment modifier un code comme celui-ci: SELECT top 1 * de analyzatedCopy2 as A où readings_miu_id = A.readings_miu_id pour obtenir ce dont j'ai besoin. – Bryan

+0

Comment définissez-vous le premier readings_miu_id distinct? A-t-il une date? – Andomar

0

Je n'ai pas une copie d'accès sur cette machine, et il a été quelques années depuis que je barboté dans l'accès, donc je prends un coup de poignard sauvage ici, mais peut vous faites un

delete from analyzedCopy2 
where readings_miu_id not in (select top 1 readings_miu_id from analyzedCopy2 order by...) 

(vous aurez besoin de l'ordre par pour obtenir le bon top 1 disque, commande par l'id peut-être?)

J'ai aucun espoir de vous aider avec la seconde sans une copie d'accès. Je sais comment je le ferais dans TSQL, mais l'accès est un tout autre type de wtf :-)

+0

est un peu proche mais supprime tous les enregistrements où readings_miu_id n'est pas égal à readings_miu_id supérieur dans la table entière au lieu de supprimer uniquement les lignes dupliquées readings_miu_id. J'ai essayé ceci: supprimez de analyzeCopy2 comme A où readings_miu_id n'est pas dans (sélectionnez top 1 readings_miu_id from analysisCopy2 où analyzeCopy2.readings_miu_id = A.readings_miu_id order by readings_miu_id) mais cela ne supprime rien. pour autant que je puisse dire c'est parce que je regarde la valeur du top 1 readings_miu_id (qui est tous d'eux quand je le fais de cette façon) au lieu de l'ensemble du record 1 – Bryan

+0

Euh, j'ai lu votre question initiale comme demandant exactement ce que cela vous donne - vous voulez supprimer tout sauf le TOP 1, et c'est exactement ce que le SQL de Dan vous donne. Peut-être que vous avez besoin de modifier votre question. Cela devrait être complètement réalisable sans table temporaire. –

0

Je tentais de faire trop compliqué, puisque tous les dossiers que je devais tirer avaient les mêmes informations dans chaque domaine que je devais tout ce que je devais faire usage était:

SELECT DISTINCT readings_miu_id, DateRange, RSSI, ColRSSI, Firmware, CFGDate, FreqCorr, Active, OriginCol, ColID, Ownage, SiteID, PremID, prem_group1, prem_group2 
FROM analyzedCopy2 
ORDER BY readings_miu_id; 

pour tirez le premier enregistrement par readings_miu_id.

Questions connexes