2017-10-15 17 views
0

Je commencerai par dire que je suis novice. J'ai deux tables (emplacements et actifs). La table de localisation a fac_id/bldg/location_code/loc_id et la table de ressources a fac_id/bldg/location_code/loc_id. J'ai besoin de mettre à jour la table d'actifs loc_id avec le loc_id de la table d'emplacement où le loc_id est null dans la table d'actifs. Cependant, le fac_id/bldg/location_code doit être mis en correspondance dans les deux tables pour mettre à jour le loc_id correct. J'ai un script sur lequel je continue d'avoir des erreurs. J'ai essayé beaucoup de réglages différents de la recherche sur Internet (joindre, jointure interne, fusionner, où existent, etc ...) et rien ne fonctionne. Sur ce script original, je reçois soit une erreur de lignes trop ou une sous-requête de ligne unique renvoie plus d'une ligne. J'espère que la solution est quelque chose de simple que je ne connais tout simplement pas.Mise à jour Oracle utilisant plusieurs colonnes sans clé unique

J'apprécie toute aide, ma tête me fait mal de la heurter contre le mur.


UPDATE asset b 
SET b.loc_id = (SELECT DISTINCT l.fac_id, l.bldg, l.location_code, l.loc_id 
       FROM location l 
       WHERE upper(trim(b.fac_id))=upper(trim(l.fac_id)) 
        AND upper(trim(b.bldg))=upper(trim(l.bldg)) 
        AND upper(trim(b.location_code))=upper(trim(l.location_code)) 
       ) 
WHERE b.loc_id IS NULL; 

Merci!

Répondre

0

La solution est simple and rownum = 1:

UPDATE asset b 
    SET b.loc_id = (SELECT l.loc_id 
        FROM location l 
        WHERE upper(trim(b.fac_id)) = upper(trim(l.fac_id)) AND 
          upper(trim(b.bldg)) = upper(trim(l.bldg)) AND 
          upper(trim(b.location_code)) = upper(trim(l.location_code)) AND 
          rownum = 1 
        ) 
    WHERE b.loc_id IS NULL; 

Cependant, cela peut ne pas être une "vraie" solution. Vous devriez comprendre pourquoi vous êtes plusieurs lignes correspondantes. Peut-être que quelque chose ne va pas avec votre condition de corrélation ou avec votre logique.