2009-11-07 68 views
2

我有下面的表格,我想用下面给出的另一个表格进行更新。 alt text http://img94.imageshack.us/img94/4602/leisureoriginal.png更新表格的行使用另一个表格的多个列的数据

我想在ProductId的基础上使用下表来更新上面给定表的空值。 alt text http://img264.imageshack.us/img264/512/datatable2.png

更新的表应该是这样的。 alt text http://img690.imageshack.us/img690/9585/updatedtable.png

我刚才在这些表中提到了ProductId。我不知道确切的ProductId。它可以是任何ProductId。

我知道FieldId和FieldValue在第2表中。

我可以在一个UPDATE语句中为所有列执行此操作。

+0

可以列出源表和目标表的所有列名 – Jebli 2009-11-07 20:00:00

+0

列名称位于图像的标题中。源表是第二个,目标表是第一个。 – Kashif 2009-11-07 20:06:59

回答

1

在SQL Server中,PIVOT关键字将行变成列。我们需要两个PIVOT,一个用于FieldId,一个用于FieldValue。 ;WITH关键字(前面有分号以区别于不相关的WITH ROLLUP命令)允许我们使用创建“临时视图”,我们稍后在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

在SQL Server中,UPDATE语句允许带有JOINS的FROM子句。例如,此查询将更新评级字段:

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

您可以复制此查询以查找其他字段。也可以更新查询中的更多字段,但在这种情况下似乎没有必要。

0

也许是这样的:

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 

要一次修改所有列,你将需要使用子查询:

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

你首先需要改变你的第二个表,以便它每个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 

然后,您可以在一个更新查询中更新此表中第一个表中的所有列。请注意,您可以将上面的第二个表格视图进行设置,以便稍后使用它。 (我们现在将它称为SecondTableView;顺便说一下,它现在具有第一个表格的确切形式)。

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

这种方法的问题是,你必须知道所有的时间提前了每个产品的可能领域,但其几乎总是需要的,因为表模式被固定。

相关问题