2017-08-23 6 views
0

J'ai une table dans MS ACCESS 2013 qui ressemble à ceci:MsAccess Supprimer toutes les valeurs, mais une colonne par condition

Id  Department  Status   FollowingDept   ActualArea 
    1000   Thinkerers  Thinking   Thinkerer    Thinkerer  
    1000   Drawers   OnDrawBoard  Drawers    Drawers 
    1000   MaterialPlan  To Plan   MaterialPlan  MaterialPlan 
    1000   Painters   MatNeeded   MaterialPlan   
    1000   Builders   DrawsNeeded  Drawers    

Le tableau donne suite à un ID qui doit passer par cinq départements, chaque département avec au moins 5 statuts différents.

Chaque état a une valeur de FollowingDept, comme *Department* Thinkerers a le statut MoreCoffeeNow qui signifie *FollowingDept* Drawers.

Toutes les colonnes, sauf ActualArea, sont des colonnes dont les valeurs proviennent du flux d'une requête.

ActualArea est un Expr où j'inséré cette logique:

Iif(FollowingDept = Department, FollowingDept, "") 

Ma logique est simple, si le FollowingDept et le ministère coïncident, alors ActualArea de l'ID obtient la valeur de FollowingDept. Mais comme vous pouvez le voir, il peut y avoir de rares cas où un ID est comme mon exemple ci-dessus, où 3 départements coïncident avec le FollowDept. Ces cas sont rares, mais j'aimerais ajouter quelque chose comme une priorité à Access.

Thinkerers a la priorité absolue, puis MaterialPlan, puis Drawers, puis Builders et enfin Painters. Ainsi, en suivant le même exemple, après qu'AccupArea ait reçu 3 valeurs, Access exécutera une autre requête ou sous-requête ou autre, où il évaluera chaque priorité de valeur et ne laissera que celle avec la priorité la plus haute. Ainsi, dans cet exemple, Thinkerers obtient la priorité maximale et les deux autres valeurs sont éliminées de la colonne ActualArea.

S'il vous plaît garder à l'esprit il y a plus de 500 différents ID, chaque identifiant est répété 5 fois, donc nombre total d'enregistrements pour évaluer sera 2500.

Répondre

0

Vous avez besoin d'une autre table, avec les valeurs possibles pour actualArea et les priorités les numéros, et vous pouvez sélectionner un JOIN et l'ordre sur la priorité:

SELECT TOP 1 d.*, p.priority 
FROM departments d 
LEFT JOIN priorities p ON d.actualArea = p.dept 
WHERE d.id = 1000 
AND p.priority IS NOT NULL 
ORDER BY p.priority ASC 

l'eST PAS clause NULL supprime toutes les lignes où actualArea est vide. La condition TOP ne laisse que la ligne avec la priorité la plus élevée.

Vous ne semblez pas avoir de clé primaire pour votre table. Si vous ne le faites pas, alors je vais donner une autre requête dans une minute, mais je voudrais fortement vous conseiller de revenir en arrière et d'ajouter une clé primaire à la table. Cela vous épargnera une quantité incroyable de maux de tête plus tard. J'ai ajouté une telle clé à ma table de test, et elle s'appelle pID. Cette requête fait usage de cette pid supprimer les enregistrements dont vous avez besoin:

DELETE FROM departments WHERE pID NOT IN (

    SELECT TOP 1 d.pID 
    FROM departments d 
    LEFT JOIN priorities p ON d.actualArea = p.dept 
    WHERE id = 1000 
    AND p.priority IS NOT NULL 
    ORDER BY p.priority ASC 

) 

Si vous ne pouvez pas ajouter une clé primaire aux données et actualArea est supposé être unique, vous pouvez simplement utiliser la actualArea valeurs pour effectuer la suppression:

DELETE FROM departments WHERE actualArea NOT IN (

    SELECT TOP 1 d.actualArea 
    FROM departments d 
    LEFT JOIN priorities p ON d.actualArea = p.dept 
    WHERE id = 1000 
    AND p.priority IS NOT NULL 
    ORDER BY p.priority ASC 

) AND id = 1000 

Si actualArea ne va pas être unique, nous devrons revoir cette réponse. Cette réponse suppose également que vous avez déjà le numéro d'identification.

+0

Merci, je vais ajouter une nouvelle table comme vous l'avez dit et voir comment ça se passe.En fait, en supposant que tout se passe bien, je vais extraire chaque ID où il y a une valeur dans ActualArea. Comme je l'ai dit, il y a 500 identifiants uniques répétés 5 fois chacun, après avoir obtenu le bon ActualArea je vais extraire cet enregistrement, donc je devrais finir avec une autre table ayant 500 identifiants uniques à nouveau. Merci pour la réponse, – Eduardo

+0

Si vous voulez tout faire en une seule requête, c'est aussi possible. Je peux vous montrer comment faire, si cette requête originale fait ce que vous voulez qu'elle fasse. –