web-dev-qa-db-fra.com

Mettre à jour une seule table en fonction des données de plusieurs tables SQL Server 2005,2008

J'ai besoin de mettre à jour la table one en utilisant les données de la table two. Les tableaux un et deux ne sont liés par aucune colonne commune. La table three est liée à la table two.

Ex: table un (table reg_det)

reg_det_id | reg_id | results
101        | 11     | 344

table deux: (table temp)

venue                    | results
Anheim convention center | 355

Tableau trois (regmaster-tbl)

reg_id| venue
11    | Anaheim convention center

J'ai besoin de mettre à jour la colonne des résultats du tableau un en utilisant les données du tableau deux. Mais les tableaux un et deux ne sont pas liés. Les tableaux deux et trois et les tableaux un et trois sont liés comme vous pouvez le voir ci-dessus. Quelqu'un peut-il suggérer des idées! J'ai besoin que la valeur des résultats soit 355 dans le tableau un et ces données proviennent du tableau 2, mais ces deux-là ne sont pas liés et peuvent être liés à l'aide du tableau trois. Désolé si c'est déroutant!

11
user1984533

Assez simple:

UPDATE T1
SET result = t2.results
FROM [table one] T1
INNER JOIN [table three] t3
 on t1.reg_id = t3.reg_id
INNER JOIN [table two] T2
 on t2.venue = t3.venue
13
MBulava

Presque une question au lieu d'une réponse. :)

Ne pourriez-vous pas utiliser une jointure interne implicite?

UPDATE rd
   SET rd.results = tt.results
  FROM reg_det rd, regmaster rm, temptable tt
 WHERE rm.reg_id = rd.reg_id
   AND rm.venue = tt.venue;

Je le trouve plus facile à lire, et cette syntaxe fonctionne dans une instruction SELECT, avec la même signification qu'une jointure interne explicite.

5
Jesse Chisholm

Essaye ça:

UPDATE rd
SET rd.results = t.results
FROM reg_det rd
JOIN regmaster rm ON rm.reg_id = rd.reg_id
JOIN temptable t ON t.venue = rm.venue
WHERE t.results = 355

J'ai ajouté une clause WHERE car sinon, elle mettra à jour tous les enregistrements reg_det qui ont des correspondances dans regmaster et tentables.

1
criticalfix