2017-08-08 6 views
1

J'ai une table (par exemple, ABC), qui a la structure suivante:mise à jour d'une table avec des valeurs d'une autre table

COMP_CODE NAME SALARY SID1 
------------------------------------- 
    NULL  Alex  42000  85 
    NULL  Alex  42000  89 
    NULL  Alex  42000  96 
    NULL  Alex  42000 100 
    NULL  Alex  42000  52 

Je veux mettre à jour le _ COMP_CODE _ colonne dans le tableau ci-dessus de la valeur résidant dans une autre table (CC). Les colonnes correspondantes parmi les deux tables sont SID1. La structure de CC est comme suit:

COMP_CODE SID1 
---------------------- 
    0AA   85 
    0AB   96 
    0CD   98 
    0DE   72 
    0EH  100 

cela peut-il atteint par un CURSEUR ou tout autre type de méthode.

+0

Vous pouvez utiliser la requête directe pour mettre à jour la table ABC. Pourquoi utiliser le curseur? – MKR

+0

C'est facile quand il y a un 'comp_code' pour chaque' sid1'. Mais que voulez-vous pour 96? Minimum, maximum, premier non utilisé? S'il vous plaît expliquer et montrer la production attendue. –

+0

@ManojKumarRai Je veux mettre à jour l'ensemble des données en une seule fois, c'est pourquoi! – hashir

Répondre

1
MERGE INTO ABC t1 
USING (select SID,max(COMP_CODE) COMP_CODE from CC GROUP BY SID) t2 
ON (t1.SID1= t2.SID1) 
WHEN MATCHED THEN 
UPDATE SET t1.COMP_CODE = t2.COMP_CODE 
+0

ORA-30926: impossible d'obtenir un ensemble stable de lignes dans les tables sources – hashir

+0

Oups Je n'ai pas vu que vous aviez plusieurs valeurs dans CC. C'est ce qui donne l'erreur. Vous devez choisir quelle valeur utiliser. J'ai modifié la requête pour donner une option. –

+0

@GordonLinoff Je pense que j'ai pris une décision hâtive en choisissant la bonne réponse à la question. Après un peu de réflexion sur la solution grâce à la technique _ ** MERGE ** _, je peux dire que c'est beaucoup plus sensé et significatif. Appréciez l'effort de tout le monde cependant. – hashir

1

D'abord, il n'est pas nécessaire de stocker les données deux fois. Vous pouvez simplement le récupérer en utilisant un JOIN lorsque vous en avez besoin.

Vous pouvez mettre à jour les valeurs:

update abc 
    set comp_code = (select cc.comp_code 
        from cc 
        where cc.sid1 = abc.sid1 
        ); 

Cela mettra à jour toutes les lignes abc. Si sid1 ne correspond pas dans la deuxième table, la valeur restera NULL.

EDIT:

Votre deuxième table a plusieurs lignes avec la même valeur. Vous devez savoir lequel vous voulez. Pour choisir un arbitraire:

update abc 
    set comp_code = (select cc.comp_code 
        from cc 
        where cc.sid1 = abc.sid1 and rownum = 1 
        ); 

Vous pouvez également choisir MIN(), MAX(), LISTAGG() ou une autre combinaison de valeurs.

+0

Homme lisse. Une sacrée solution. Bon travail! Merci pour votre aide – hashir

+0

@hashir. Fusionner aurait été une meilleure solution que celle-ci. Le problème était juste vos données pas la déclaration. Voir mise à jour anwer. – XING

+0

@XING Ceci met à jour une seule ligne seulement quand je l'exécute. Pas d'offense mais les données sont ce qu'elles sont. – hashir