2009-11-07 135 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 

這種方法的問題是,你必須知道所有的時間提前了每個產品的可能領域,但其幾乎總是需要的,因爲表模式被固定。

相關問題