0

我有一个构建查询的引擎。所以这不是静态的,这就是为什么我必须这样做(如下)。此外,它适用于 SQL 和 Oracle(Oracle 添加了不同的包装器、RowNum 等......)。我没有简单的方法来测试 Oracle 但下面是 SQL Server 问题,一步一步的逻辑

让我们做一个简单的查询

Select field1 as f1, myDate dateFld From table1 t1 Where t1.field2 = 1

我可能会也可能不会,必须union用另一个表输出

Select field1, myDate dateFld as f1 From table1 t1 Where t1.field2 = 1
Union
Select field2, myDate dateFld as f1 From table2 t2 Where t2.field2 = 2

我只需要从这个 Union获取N条记录

Select Top(N) * 
From
   ( 
    Select field1 as f1, myDate dateFld From table1 t1 Where t1.field2 = 1
    Union
    Select field2 as f1, myDate dateFld From table2 t2 Where t2.field2 = 2
   ) Union_Tbl_Alias
Order By dateFld Desc, f1 

记住这个“订购者”

我也有 Select Subqueries(除了将它们放在 Select 中之外我无能为力),我将其移至另一个 Select 包装器

Select 
    f1, 
    myDate,
    (Select field99 From table99 t99 Where t99.f1 = Outer_Tbl_Alias.f1) as f3
From
    (
        Select Top(N) * 
        From
           ( 
            Select field1 as f1, myDate dateFld From table1 t1 Where t1.field2 = 1
            Union
            Select field2 as f1, myDate dateFld From table2 t2 Where t2.field2 = 2
           )
        Order By dateFld Desc, f1
    ) Outer_Tbl_Alias

所以问题是最外层的选择会稍微重新洗牌记录。他们不再对 dateFld Desc 进行排序。我不想推测,我认为这只是 SQL Server 问题,但我也会在 oracle 中对其进行测试。将“Order By”移动到最外层的语句可以为 SQL Server 修复它。

但我想知道:

1 -为什么会发生?

2 -是否有提示告诉 SQL 服务器 - 保持内部 Select 的顺序?

4

1 回答 1

3

这种行为似乎是有道理的。您的外部查询不包含ORDER BY子句,因此结果的顺序是任意的。行可能已在子查询中排序的事实无法控制(尽管它无疑最终会影响结果的顺序)。由于您正在以编程方式构建查询,因此添加您想要的任何ORDER BY子句比尝试解决该问题更有意义(而且我不知道有一种方法可以解决每次都能保证工作的问题)。

TOP当您针对 Oracle 数据库运行并为几个带有rownum谓词的嵌套查询切换时,您将遇到完全相同的问题。保证结果顺序的唯一方法是添加一个ORDER BY子句。ORDER BY由于无论您使用哪种数据库,这都是必要的,因此通过将附加内容添加到外部查询而不是使用不同的特定于数据库的解决方法来正确执行此操作更有意义。

于 2013-09-18T22:56:03.887 回答