2011-10-28 6 views
4

J'ai un SQL SELECT étendu qui effectue un calcul de TotalNetWorth pour un certain nombre d'utilisateurs. Le résultat est le TotalNetworth et l'utilisateur. Cela peut contenir plusieurs enregistrements. Exemple:SQL Update avec les résultats de SELECT

------------------------- 
|TotalNetWorth | UserId | 
------------------------- 
| 24.45  | 1  | 
| 45.34  | 3  | 
------------------------- 

Ce que je veux faire est de mettre à jour la colonne NetWorth dans ma table Users avec la valeur TotalNetWorth et UserId = Users.Id comme la clé. Quelle est la meilleure façon d'y parvenir?

+1

Quel serveur de base de données? La réponse peut être différente. SQL Server, par exemple, a des CTE où MySQL ne le fait pas. –

+0

@KenWhite ne pensait pas que cela faisait une différence. J'ai mis à jour avec la balise mySQL. – xdumaine

Répondre

4

Vous pouvez utiliser un JOIN sur une sous-requête crénelage.

UPDATE 
    Users 
FROM 
    Users u 
INNER JOIN 
(SELECT WhatEver FROM YourQueryThatCalcsNetWorth) nw 
ON 
    nw.UserID = u.UserId 
+0

Je l'ai testé et j'ai une erreur dans la section 'FROM Users U'. Suppression de cette section pour que la requête fonctionne. – SAMPro

1

Quelque chose comme ça

UPDATE u 
FROM Users u 
JOIN tableTotalNetWorth t ON t.UserID = u.UserId 
1
CREATE TEMPORARY TABLE TempNetWorth AS (SELECT * FROM [your query]) 

UPDATE Users u, TempNetWorth t 
SET u.NetWorth = t.TotalNetWorth 
WHERE u.UserID = t.UserId 
+1

Une table temporaire n'est pas nécessaire ici. Une jointure simple sur une sous-requête avec alias fonctionnera très bien. (Notez que je ne suis pas downvoting, juste faire un commentaire.) –

+0

@KenWhite Cela a fonctionné! Faites-en une réponse! – xdumaine

0

Vous pourriez faire une INSERT .... SELECT .... ON DUPLICATE KEY UPDATE ...., comme expliqué here.

1

faire votre sélection puis mettre à jour immédiatement avec cte aide

WITH cte_query AS (
    SELECT TotalNetWorth = <calculate_total> 
    FROM [Users]) 
UPDATE cte_query 
SET TotalNetWorth = TotalNetWorth; 
+1

btw, cela fonctionne sur sql 2005 et au-dessus –

0

Vous pourriez avoir à utiliser votre vaste requête SELECT pour extraire des données dans une table temporaire d'abord, dire « temp » puis essayez d'utiliser cette requête :

Update Users set NetWorth = (select TotalNetWorth from temp where Users.Id = temp.UserId) 
+0

Pas de table temporaire nécessaire. Vous pouvez créer un alias pour la sous-requête et faire un "INNER JOIN" direct. –