我希望这不是一个重复的讨论。我确实搜索了论坛,没有找到任何与我的问题相关的东西。顺便说一下,我喜欢这个网站。它已经帮了我好几年了,我通常会通过搜索这个网站来解决我所有的问题。
无论如何,我在SQL中遇到了ROW_NUMBER()函数的问题。我创建了一个视图,它涉及到连接一个不同的视图和一个表,在视图中,我从视图和表中提取字段,但我还创建了两个字段,即ROW_Number()字段seq_number和另一个字段seq_alpha。
Seq Number字段为:
ROW_NUMBER() over(order by book_date, room, start) as seq_number
seq_alpha字段是一个大小写字段,它基于行号来给出一个字母。
例如
case ROW_NUMBER() over(order by book_date, Room, Start)当1然后'A'当2时,则"B"when 3 then 'C'….以seq_alpha结尾
当我为测试目的创建视图时,我使用了WHERE子句,并且一切都按照它应该的方式工作。然后注释掉Where子句并创建表。
然后在视图创建后,我试图拉创建的视图,并使用创建视图时工作的相同Where子句,但现在这样做:
select *从created_viewwhere(与我用于测试的相同)
但是现在发生的是seq_number字段查看整个视图,而不是让where子句过滤掉结果。所有其他数据都可以正确提取,但seq_number和seq_alpha字段不能。因此,在我的22个结果中,seq数字不是1-22,而是400,000范围,seq_alpha字段甚至不显示任何内容,因为在我的情况下,我只增加了51。
是否有人有类似的问题,试图拉row_number字段后,它被创建和字段不过滤的结果与where子句?
提前感谢您的帮助!
编辑在Mikael的响应之后,我似乎不太可能在视图中创建row_number字段,然后查询视图,并使其按我想要的方式工作。所以,我的下一个问题是,是否有一种方法来创建基于行号的阿尔法序列,我可以在视图中,并能够查询以后,并能够有它的工作正确基于where子句?还是我只需要在每次拉视图时创建alpha序列字段?
Jrow_number()
枚举在where子句应用后执行时所看到的行。
这将枚举整个表
select ID,
row_number() over(order by ID) as rn
from YourTable
,这将枚举ID <10
select ID,
row_number() over(order by ID) as rn
from YourTable
where ID < 10
如果创建一个查询整个表的视图
create view ViewYourTable as
select ID,
row_number() over(order by ID) as rn
from YourTable
,然后用where子句ID <10
select T.*
from ViewYourTable as T
where T.ID < 10
您所做的与使用派生表相同。
select T.*
from (
select ID,
row_number() over(order by ID) as rn
from YourTable
) as T
where T.ID < 10
where子句在枚举行之后应用。