【发布时间】:2017-11-06 15:11:49
【问题描述】:
这是我在一次采访中被问到的一个问题。对于这样的表(可能有数百或数千条此类记录)
什么是恢复 Seq 的最佳方法,这样 A 将是 seq 4,B 将是 seq 1,如下所示:
我给了他以下查询(我使用 CTE 只是为了创建示例场景。在原始情况下它是一个表):
WITH CTE
AS
(
SELECT
Seq = 1,Nm = 'A'
UNION
SELECT
Seq = 2,Nm = 'A'
UNION
SELECT
Seq = 3,Nm = 'B'
UNION
SELECT
Seq = 4,Nm = 'B'
)
SELECT
Seq = ROW_NUMBER() OVER(ORDER BY Seq DESC),
Seq,
Nm
FROM CTE;
是否有任何替代的动态查询以更有效的方式实现相同的目标?
【问题讨论】:
-
一个非常人为的问题对我来说似乎很合理。
-
将
UNION更改为UNION ALL,这是此查询中唯一可以进行的改进。或者,如果您能解释您最初的要求,我们可以看看是否有更好的方法。 -
别为工会操心了。我写这个只是为了检查场景。实际输入将是具有相同结构的表
-
JayasuryaSatheesh 我们打扰是因为这很重要,所以请听从建议。正如@Pரதீப் 所说,除了检查索引之外,您无法再改进该查询
-
还有另一种产生所需输出的方法。您可以使用
ABS(Seq - sqq - 1),其中sqq是Seq列中的最大值,但此解决方案需要以某种方式从Seq获得最大值并在Seq列上使用函数,这可以防止使用索引。跨度>
标签: sql sql-server sql-server-2008 sql-server-2012