如何在SQL Server的表中不存在的列上使用"WHERE"条件执行"SELECT"查询

Zoh*_*sef 2 sql sql-server select

为了理解这个问题,我将展示一个例子:表中的Students列是:

stuID, cityID, Name, updateDate
Run Code Online (Sandbox Code Playgroud)

我的SELECT是:

SELECT
    ROW_NUMBER() OVER (PARTITION BY cityID ORDER BY updateDate DESC) AS rownumber 
    stuID,
    cityID,
    Name
FROM
    Students 
WHERE 
    rownumber = 1
Run Code Online (Sandbox Code Playgroud)

无论如何 - 为什么我想进行这样的查询,这只是一个例子,但我如何在rownumber上放入"WHERE"条件????

The*_*war 8

WHERE条款将立即进行后评估FROM条款,所以SQL不知道,当你是指someValue中你选择refered

如果要将谓词应用于RowNumber,请使用CTE/SubQuery:

 ;With cte
    as
    (
    SELECT
          ROW_NUMBER() OVER (PARTITION BY cityID ORDER BY updateDate DESC) AS rownumber 
          stuID,
          cityID,
          Name
    FROM Students 

    )
    select * from cte where rownumber=1
Run Code Online (Sandbox Code Playgroud)

以下是逻辑查询阶段,它们规定了如何在一个阶段中定义的条款可用于下一阶段的条款.

1. FROM
2. ON
3.OUTER
4.WHERE
5.GROUP BY
6.CUBE | ROLLUP
7.HAVING
8. SELECT
9. DISTINCT
10. TOP
11. ORDER BY
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,RowNumber您已经定义了in select子句,它将仅在select之后的下一个阶段可用

下面是每个子句的逻辑查询处理流程图:Itzik Ben-Gan

在此输入图像描述


Iva*_*tin 5

如果将查询放入子查询或CTE,则可以使用任何别名和计算字段:

select *
from
(
    SELECT
          ROW_NUMBER() OVER (PARTITION BY cityID ORDER BY updateDate DESC) AS rownumber 
          stuID,
          cityID,
          Name
    FROM Students
) s
WHERE rownumber = 1
Run Code Online (Sandbox Code Playgroud)