我有“BigTable”表,它有大约80列但我需要生成一个“Rank”列,我将在更新期间使用它。我现在的查询看起来像这样。
UPDATE bt
SET bt.UpdateColumn = CASE WHEN (SomeCondition >= bt.RankField)
THEN bt.UpdateColumn + 0.01
ELSE bt.UpdateColumn
END
FROM (SELECT bt.*,RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS RankField FROM BigTable bt) bt
INNER JOIN AnotherTable atbl
ON bt.Col1 = atbl.Col2
如果我将代码更改为类似的东西会更好吗?派生表中的列数是否在连接期间很重要。
UPDATE bt
SET bt.UpdateColumn = CASE WHEN (SomeCondition >= bt.RankField)
THEN bt.UpdateColumn + 0.01
ELSE bt.UpdateColumn
END
FROM (SELECT bt.Col1,RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS RankField FROM BigTable bt) bt
INNER JOIN AnotherTable atbl
ON bt.Col1 = atbl.Col2
答案 0 :(得分:0)
使用子查询完全没有区别。
SQL Server有一个很好的优化器。优化器执行的操作之一是,一旦开始将页面数据加载到工作内存中,就从数据页中选择所需的列。事实上,SQL Server通常会将列上的表达式推送到此阶段。
没有理由在没有必要的情况下放置这样的子查询。
答案 1 :(得分:0)
希望您的数据库设计符合您的要求。 希望您正确处理您的要求。 这两个是最基本的东西。
试试这个,如果这个查询足够快,你可以考虑创建索引等。 顺便说一句,知道“ somecondition ”是编写正确查询所必需的。
UPDATE bt
SET bt.UpdateColumn = bt.UpdateColumn + 0.01
FROM (SELECT bt.Col1,RANK() OVER (PARTITION BY Col1 ORDER BY Col2) AS RankField FROM BigTable bt) bt
INNER JOIN AnotherTable atbl
ON bt.Col1 = atbl.Col2
where bt.RankField<=SomeCondition