86 sql t-sql sql-server analytic-functions
我Row_Number()
在where子句中找到了一个用函数回答的问题.当我尝试一个查询时,我收到以下错误:
"消息4108,级别15,状态1,行1窗口函数只能出现在SELECT或ORDER BY子句中."
这是我试过的查询.如果有人知道如何解决这个问题,请告诉我.
SELECT employee_id
FROM V_EMPLOYEE
WHERE row_number() OVER ( ORDER BY employee_id ) > 0
ORDER BY Employee_ID
Run Code Online (Sandbox Code Playgroud)
Sco*_*vey 85
要解决此问题,请将您的select语句包装在CTE中,然后您可以查询CTE并在where子句中使用窗口函数的结果.
WITH MyCte AS
(
select employee_id,
RowNum = row_number() OVER ( order by employee_id )
from V_EMPLOYEE
ORDER BY Employee_ID
)
SELECT employee_id
FROM MyCte
WHERE RowNum > 0
Run Code Online (Sandbox Code Playgroud)
Qua*_*noi 59
SELECT employee_id
FROM (
SELECT employee_id, ROW_NUMBER() OVER (ORDER BY employee_id) AS rn
FROM V_EMPLOYEE
) q
WHERE rn > 0
ORDER BY
Employee_ID
Run Code Online (Sandbox Code Playgroud)
请注意,此过滤器是多余的:ROW_NUMBER()
从1
并且始终大于0
.
小智 30
Select * from
(
Select ROW_NUMBER() OVER ( order by Id) as 'Row_Number', *
from tbl_Contact_Us
) as tbl
Where tbl.Row_Number = 5
Run Code Online (Sandbox Code Playgroud)
Mat*_*nes 19
我想你想要这样的东西:
SELECT employee_id
FROM (SELECT employee_id, row_number()
OVER (order by employee_id) AS 'rownumber'
FROM V_EMPLOYEE) TableExpressionsMustHaveAnAliasForDumbReasons
WHERE rownumber > 0
Run Code Online (Sandbox Code Playgroud)
我觉得所有显示使用 CTE 或子查询的答案都足以解决此问题,但我没有看到任何人深入了解 OP 出现问题的原因。OP建议不起作用的原因是由于此处的逻辑查询处理顺序:
- 从
- 在
- 加入
- 在哪里
- 通过...分组
- 带立方体/汇总
- 有
- 选择
- 清楚的
- 订购者
- 最佳
- 偏移/取回
我相信这对答案有很大的帮助,因为它解释了为什么会出现这样的问题。WHERE
总是在SELECT
使 CTE 或子查询成为许多功能所必需的之前处理。您将在 SQL Server 中看到很多。
在回答关于rexem的答案的评论时,关于内联视图或CTE是否会更快,我重新构建查询以使用表I,并且每个人都可以使用:sys.objects.
WITH object_rows AS (
SELECT object_id,
ROW_NUMBER() OVER ( ORDER BY object_id) RN
FROM sys.objects)
SELECT object_id
FROM object_rows
WHERE RN > 1
SELECT object_id
FROM (SELECT object_id,
ROW_NUMBER() OVER ( ORDER BY object_id) RN
FROM sys.objects) T
WHERE RN > 1
Run Code Online (Sandbox Code Playgroud)
生成的查询计划完全相同.我希望在所有情况下,查询优化器都会提出相同的计划,至少在内联视图中简单替换CTE,反之亦然.
当然,在您自己的系统上尝试自己的查询,看看是否存在差异.
此外,row_number()
where子句是Stack Overflow上给出的答案中的常见错误.row_number()
在处理select子句之前,Logicaly 不可用.人们忘记了这一点,当他们回答而没有测试答案时,答案有时是错误的.(我自己犯了罪.)
小智 7
WITH MyCte AS
(
select
employee_id,
RowNum = row_number() OVER (order by employee_id)
from V_EMPLOYEE
)
SELECT employee_id
FROM MyCte
WHERE RowNum > 0
ORDER BY employee_id
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
206443 次 |
最近记录: |