2009-11-07 4 views
2

Je tableau suivant que je veux mettre à jour à l'aide d'une autre table, ci-dessous. alt text http://img94.imageshack.us/img94/4602/leisureoriginal.pngligne Mise à jour de la table à l'aide des données de plusieurs colonnes d'une autre table

Je veux mettre à jour les valeurs nulles du tableau ci-dessus donnée en utilisant le tableau suivant sur la base de ProductId. alt text http://img264.imageshack.us/img264/512/datatable2.png

La table mise à jour devrait ressembler à ceci. alt text http://img690.imageshack.us/img690/9585/updatedtable.png

J'ai mentionné ProductId dans ce tableau juste par exemple. Je ne connais pas ProductId exact. Cela pourrait être n'importe quel ProductId.

Je sais FieldID et FieldValue à l'avance 2ème table.

Puis-je faire dans une instruction UPDATE pour toutes les colonnes.

+0

pouvez-vous lister tous les noms de colonnes de la source et la table destination des noms – Jebli

+0

Colonnes sont en-têtes, dans les images. La table source est la deuxième et la table de destination est la première. – Kashif

Répondre

1

Dans SQL Server, le mot clé PIVOT transforme les lignes en colonnes. Nous avons besoin de deux PIVOTs, un pour FieldId et un pour FieldValue. Le mot-clé ;WITH (précédé d'un point-virgule pour le distinguer de la commande WITH ROLLUP non apparentée) nous permet d'utiliser la création de "vues temporaires" que nous utiliserons plus tard dans l'instruction UPDATE.

;WITH FieldIds AS (SELECT * FROM (SELECT ProductId, FieldId FROM ProductFields) A 
        PIVOT (MAX(FieldId) FOR FieldId IN ([50], [55], [60])) AS B), 
     FieldValues AS (SELECT * FROM ProductFields 
         PIVOT (MAX(FieldValue) FOR FieldId IN ([50], [55], [60])) AS C) 
UPDATE Products 
SET 
    RatingId = FieldIds.[50], 
    Rating = FieldValues.[50], 
    LeisureId = FieldIds.[55], 
    Leisure = FieldValues.[55], 
    SpaId = FieldIds.[60], 
    Spa = FieldValues.[60] 
FROM Products 
INNER JOIN FieldIds ON FieldIds.ProductId = Products.ProductId 
INNER JOIN FieldValues ON FieldValues.ProductId = Products.ProductId 
0

Dans SQL Server, une instruction UPDATE permet une clause FROM avec REJOINT. Par exemple, cette requête mettrait à jour le champ Classification:

UPDATE  p 
SET   p.Rating = pf.FieldValue 
FROM  Products p 
INNER JOIN ProductField pf 
ON   pf.ProductId = p.ProductId 
WHERE  pf.FieldId = 50 

Vous pouvez copier cette requête pour les autres champs. Il est également possible de mettre à jour plusieurs champs dans la requête, mais cela ne semble pas nécessaire dans ce cas.

0

Peut-être quelque chose comme ceci:

Update T1 
Set T1.RatingID = T2.FieldID, 
T1.Rating = T2.FieldValue 
From Table1 T1 
Inner JOin Table2 T2 
On T1.ProductID = T2.ProductID 
Where T2.FieldID = 50 

Pour modifier toutes les colonnes à la fois, vous devez utiliser les sous-requêtes:

Update T1 
Set T1.RatingID = (Select T2.FieldID 
        From Table2 T2 
      Where T2.FieldID = 50 
      And T2.ProductID = T1.ProductID) 
From Table1 T1 
0

Vous devez d'abord transformer votre seconde table afin que contient seulement une ligne par ProductID.

SELECT t1.ProductID, t1.FieldID AS RatingID, t1.FieldValue AS Rating, 
     t2.FieldID AS LeisureID, t2.FieldValue AS Leisure, etc. 
FROM SecondTable t1 
LEFT OUTER JOIN SecondTable t2 
     ON t1.ProductID = t2.ProductID 
     AND t2.FieldValue = 55 
LEFT OUTER JOIN SecondTable t3 
     ON t1.ProductID = t3.ProductID 
     AND t3.FieldValue = 60 
WHERE t1.FieldValue = 50 

Ensuite, vous pouvez mettre à jour toutes les colonnes de la première table de cette table dans une requête de mise à jour. Notez que vous pourriez faire de la vue ci-dessus une vue de la deuxième table afin que ce soit plus facile à utiliser plus tard. (Nous l'appellerons SecondTableView pour l'instant, il a d'ailleurs la forme exacte de la première table maintenant).

UPDATE FirstTable 
SET RatingID = t1.RatingID, Rating = t1.Rating, etc. 
FROM SecondTableView t1 
WHERE FirstTable.ProductID = t1.ProductID 

Le problème avec cette approche est que vous devez connaître tous les champs possibles pour chaque produit à l'avance, mais qui est à peu près nécessaire de toute façon à cause du schéma de la table étant fixe.

Questions connexes