Oracle 到 SQL 服务器:返回的行集有限的动态查询
Oracle to SQL Server : dynamic query with limited rowset returned
我有一个困难的(如果不是不可能的话)问题需要解决。我有一个 Oracle 查询,我必须将它转换为 T-SQL 语法。
Oracle 中的查询如下所示:
__select_wrapper=select * from(
select rownum row_num, inner__c3p__query.*
from ({0}) inner__c3p__query)
where row_num>@offset and (row_num<=(@offset+@count) or (@count<1))
这来自属性文件。基本上,这一行执行任何 SQL 查询,将结果集命名为 "inner__c3p__query",并从中选择所有内容以及一个 rownum。然后,它通过 rownum 过滤结果:>@offset 和 <=@offset + @count。因此,实际上,它执行任何 SQL 查询,并且 returns 一个有限的行集,例如从第10行到第20行。
现在,我的工作是将其转化为T-SQL。我花了一天半的时间查找所有可能的想法,但到目前为止,我还没有成功。我尝试了很多东西,但都没有用。问题是,我不能使用 ROW_NUMBER()
函数,因为它在 OVER()
子句中至少需要一列,而我无法提供任何列,因为实际查询仅在运行时确定。
你们有什么想法吗,或者在数据库方面真的不可能吗?
提前致谢!
加布
ROW_NUMBER() 只需要 ORDER BY 部分中的一列(否则你如何排序?)
如果原始顺序是随机的,那么只需在查询中选择一个随机列(如第一列)。在 ORDER BY 中,您可以使用列号...只需使用第一列或第一列。
ROW_NUMBER() OVER (ORDER BY 1)
虽然我对这种方法有很多保留意见,尤其是针对 SQL 注入攻击,但以下方法应该有效:
select * from(
select ROW_NUMBER() OVER(ORDER BY (Select NULL)) row_num,
inner__c3p__query.*
from ({0}) inner__c3p__query)
where row_num>@offset and (row_num<=(@offset+@count) or (@count<1))
不幸的是,由于排序列永远不会改变,如果您尝试使用它进行分页,则无法保证在重复执行中始终将相同的 row_num 分配给同一行。
我有一个困难的(如果不是不可能的话)问题需要解决。我有一个 Oracle 查询,我必须将它转换为 T-SQL 语法。
Oracle 中的查询如下所示:
__select_wrapper=select * from(
select rownum row_num, inner__c3p__query.*
from ({0}) inner__c3p__query)
where row_num>@offset and (row_num<=(@offset+@count) or (@count<1))
这来自属性文件。基本上,这一行执行任何 SQL 查询,将结果集命名为 "inner__c3p__query",并从中选择所有内容以及一个 rownum。然后,它通过 rownum 过滤结果:>@offset 和 <=@offset + @count。因此,实际上,它执行任何 SQL 查询,并且 returns 一个有限的行集,例如从第10行到第20行。
现在,我的工作是将其转化为T-SQL。我花了一天半的时间查找所有可能的想法,但到目前为止,我还没有成功。我尝试了很多东西,但都没有用。问题是,我不能使用 ROW_NUMBER()
函数,因为它在 OVER()
子句中至少需要一列,而我无法提供任何列,因为实际查询仅在运行时确定。
你们有什么想法吗,或者在数据库方面真的不可能吗?
提前致谢!
加布
ROW_NUMBER() 只需要 ORDER BY 部分中的一列(否则你如何排序?)
如果原始顺序是随机的,那么只需在查询中选择一个随机列(如第一列)。在 ORDER BY 中,您可以使用列号...只需使用第一列或第一列。
ROW_NUMBER() OVER (ORDER BY 1)
虽然我对这种方法有很多保留意见,尤其是针对 SQL 注入攻击,但以下方法应该有效:
select * from(
select ROW_NUMBER() OVER(ORDER BY (Select NULL)) row_num,
inner__c3p__query.*
from ({0}) inner__c3p__query)
where row_num>@offset and (row_num<=(@offset+@count) or (@count<1))
不幸的是,由于排序列永远不会改变,如果您尝试使用它进行分页,则无法保证在重复执行中始终将相同的 row_num 分配给同一行。