2012-01-31 3 views
-2

J'ai 3 tables:mise à jour sql (me aider)

 
tbl_indicator 

grp_nbr, sect_nbr, indicat 
1    100   p 
2    101   s
 
tbl_group 

grp_id, grp_nbr, sect_nbr,  indicat 
333   1    100   a 
555   1    100   p 
444   2    101   s 
222   2    101   y

ici (en tbl_group) grp_id est la clé primaire

 
tbl_order 

order_id,  grp_id 
5000    333 
5001    555 
5002    555 
5003    555 
5004    444 
5005    444 
5006    222

ici (en tbl_order) grp_id est une clé étrangère à grp_id en tbl_group.

Dans la table tbl_indiactor, pour un ensemble de grp_nbr et sect_nbr il y a un indicat, pour le même ensemble de grp_nbr et sect_nbr il y a un index correct (555,1, 100, p) et un indice indésirable (333, 1 , 100, a) dans la table tbl_group, mais ces deux grp_id s (333, 555) sont présents dans la table tbl_orders.

Maintenant je dois mettre à jour la table de tbl_order de telle sorte que les grp_id junk s devraient être remplacés par des grp_id correcte s

La sortie devrait comme:

 
tbl_orders 

order_id,  grp_id 
5000    555 
5001    555 
5002    555 
5003    555 
5004    444 
5005    444 
5006    444

est ici un petit changement

tbl_indicator

grp_nbr, sect_nbr, indiqu
01 100 p
02 101 de tbl_group

grp_id, grp_nbr, sect_nbr, indicat
333 01 100 un
555 01 100 p
444 02 101 s 222 2 101 y ici (en tbl_group) grp_id est primaire Key

les données indésirables (indicat) dans la table de groupe (222, 22, 101, y) le grp_nbr a une longueur de caractère mais le grp_nbr dans tbl_indicat a deux caractères ... comment pouvons-nous gérer cela ??

+2

Avez-vous essayé quelque chose de plus que de poster une question ici sans regarder les directives de faq ou de mise en page? – JNK

+0

ai-je fait quelque chose de mal ?? désolé pour le .... –

+1

"il y a un indice correct (333,1, 100, p) et un indicat indésirable (555, 1, 100, a)" - si 555 est le groupe indésirable, alors pourquoi votre désir sortie remplacer 333 avec 555? Votre sortie désirée remplace également 222 par 444. Il semble que vous considérez 222 et 333 comme de vieux enregistrements, ou "junk", parce que leur champ indicat ne correspond pas au champ indicat de leur enregistrement tbl_indicator. correct? –

Répondre

5

Tout d'abord, comprendre quels documents doivent être mis à jour:

select * 
from tbl_order o 
inner join tbl_group g on 
    g.grp_id = o.grp_id 
inner join tbl_indicator i on 
    i.grp_nbr = g.grp_nbr 
    and i.sect_nbr = g.sect_nbr 
where 
    g.indicat != i.indicat 

Maintenant, modifiez la requête de mettre à jour ces enregistrements avec le grp_id correct. Notez que j'ai ajouté une jointure supplémentaire à la table tbl_group avec un alias de "g2". Ce sera le bon groupe.

update o set 
    o.grp_id = g2.grp_id 
from tbl_order o 
inner join tbl_group g on 
    g.grp_id = o.grp_id 
inner join tbl_indicator i on 
    i.grp_nbr = g.grp_nbr 
    and i.sect_nbr = g.sect_nbr 
inner join tbl_group g2 on 
    g2.grp_nbr = i.grp_nbr 
    and g2.sect_nbr = i.sect_nbr 
    and g2.indicat = i.indicat 
where 
    g.indicat != i.indicat 

Notez qu'en raison de la jointure interne sur g2 tbl_group, les enregistrements ne sera pas mis à jour s'il n'existe aucun enregistrement de tbl_group où indiqu correspond à la valeur indiqu de son record tbl_indicator associé.

+0

a travaillé comme un charme ..... thnx une tonne ... essayant de 2 jours mais dint trouver une chance ... thnx beaucoup .. –