我有下表,我想使用另一个表更新,如下所示。alt text http://img94.imageshack.us/img94/4602/leisureoriginal.png
我想在ProductId的基础上使用下表更新上面给定表的Null值。 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。
我可以在所有列的一个UPDATE语句中执行此操作。
答案 0 :(得分:1)
在SQL Server中,PIVOT
关键字将行转换为列。我们需要两个PIVOT,一个用于FieldId,一个用于FieldValue。 ;WITH
关键字(前面有分号以区别于不相关的WITH ROLLUP
命令)允许我们使用创建“临时视图”,我们稍后会在UPDATE
语句中使用它。 / p>
;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
答案 1 :(得分: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
您可以将此查询复制到其他字段。也可以更新查询中的更多字段,但在这种情况下似乎没有必要。
答案 2 :(得分: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
答案 3 :(得分: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
这种方法的问题在于您必须提前了解每个产品的所有可能字段,但由于表格架构已修复,因此无论如何都非常需要。