我有一个构建查询的引擎。所以这不是静态的,这就是为什么我必须这样做(如下)。此外,它适用于 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 的顺序?