TRANSACT SQL - 如何基于select / where语句手动排序/索引表

时间:2010-01-06 16:41:23

标签: sql tsql sql-server-2008

我今天有sql puzzler。

我有以下sql:

  SELECT MemberId, 
         UnitId, 
         MaterialLevel, 
         MaterialText, 
         ProductPercentage, 
         ProductPriority
    FROM tblWeights
ORDER BY MemberId, MaterialLevel, MaterialText, ProductPercentage DESC

现在,ProductPriority目前为空。我想要做的是更新这个,以便每个级别的第一个产品,每个materialtext的产品百分比最高为“1”,第二个最高的百分比为“2”,等等。

但是,当materialtext更改时,它应该自行重置并再次从“1”开始。

有谁能想到我能做到这一点?

3 个答案:

答案 0 :(得分:1)

您是否有理由将productpriority明确存储在数据库中?很抱歉,如果我误解了你的问题,但这听起来好像可以在输出查询中用直接的ROW_NUMBER处理。

答案 1 :(得分:0)

您可以将其用于初始更新:

UPDATE tblWeights w1
SET    ProductPriority = (
           SELECT COUNT(*)
           FROM   tblWeights w2
           WHERE  w2.level        = w1.level
           AND    w2.materialText = w1.materialText
           AND    w2.ProductPercentage >= w1.ProductPercentage
       )

对于自动重置,您应该在DELETEUPDATEINSERT之后编写一个在语句级别触发的触发器。您可以使用此语句的修改版本,并仅更新具有受影响级别的行,materialtext组合

CREATE TRIGGER aiud_tblWeights ON tblWeights 
FOR INSERT, UPDATE, DELETE
AS
IF( UPDATE (Level) OR UPDATE (MaterialText) )
BEGIN
    UPDATE tblWeights w1
    SET    ProductPriority = (
               SELECT COUNT(*)
               FROM   tblWeights w2
               WHERE  w2.level        = w1.level
               AND    w2.materialText = w1.materialText
               AND    w2.ProductPercentage >= w1.ProductPercentage
           )
    WHERE  (w1.level, w1.materialText) IN (
        SELECT level, materialText
        FROM   inserted
        UNION ALL 
        SELECT level, materialText
        FROM   deleted
    );        
END;

答案 2 :(得分:0)

我知道为时已晚。但是当我在寻找类似的问题时,我找到了一个答案。看看是否能帮到别人。

SQL query results to be displayed in the order of the manually provided values