代码之家  ›  专栏  ›  技术社区  ›  Kashif

使用另一个表的多列中的数据更新表的行

  •  2
  • Kashif  · 技术社区  · 15 年前

    我有下表,我想用另一个表更新,如下所示。 alt text http://img94.imageshack.us/img94/4602/leisureoriginal.png

    alt text http://img264.imageshack.us/img264/512/datatable2.png

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

    例如,我在这些表中提到了ProductId。我不知道确切的产品ID。它可以是任何ProductId。

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

    4 回复  |  直到 15 年前
        1
  •  1
  •   Anthony Faull    15 年前

    在SQL Server中 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
    
        2
  •  0
  •   Andomar    15 年前

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

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

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

        3
  •  0
  •   AverageAdam    15 年前

    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
    

    这种方法的问题是,您必须提前知道每个产品的所有可能字段,但由于表模式是固定的,所以这几乎是必需的。

        4
  •  0
  •   marc_s    9 年前

    也许是这样的:

    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