3

我正在尝试使用row_number().

使用此语法

select row_number() over(order by x.patientid, x.dischargedate) as rn
         ,* from x
    inner join x as x2 on row_number() over(order by x.patientid,    x.dischargedate)=row_number() over(order by x2.patientid, x2.dischargedate)

CTEx做了我想要的,但是当我尝试加入行号时,我得到了错误 Msg 4108, Level 15, State 1, Line 35 Windowed functions can only appear in the SELECT or ORDER BY clauses.

我知道我可以在 CTE 本身中包含 row_number 并给它一个列名,然后加入类似的东西,x.rn但是有什么逻辑原因我想不出为什么你不能直接加入这个函数row_number()

4

1 回答 1

1

在内部连接的连接条件中,您正在对两个表的笛卡尔积执行过滤。因此,您的操作 row_number() over (order by xa, xb) 将不是对表 x 的操作,而是对笛卡尔生产的操作。

如果您将其置于连接条件中,则系统将处于确定您选择的候选行的阶段。您不能拥有仅在用于查找这些结果行的结果行上定义其语义的操作。过滤器会改变结果,结果也会改变过滤器。

与 CTE 的区别在于您在中间结果集上定义 row_number 列,然后进行连接。

于 2012-11-29T20:30:34.593 回答