0

处理一些遗留代码并试图让一个设计不佳的数据库显示我们想要的我在表格上做了一个自联合以按特定顺序显示记录的交集 - 简化例如

SET @setOfRecords = 1234
SET @subsetOfRecords = 4567 

--Set A
SELECT * 
FROM results
WHERE 
    resultSet = @setOfRecords AND
    resultSubset = 4567

UNION

--Set B
SELECT * 
FROM results
WHERE 
    resultSet = @setOfRecords AND
    resultSubset <> 4567

显示正确,即

Set A
Set B

但是,如果我对子集 id 进行参数化,则此顺序会颠倒 - 例如

SET @setOfRecords = 1234
SET @subsetOfRecords = 4567 

--Set A
SELECT * 
FROM results
WHERE 
    resultSet = @setOfRecords AND
    resultSubset = @subsetOfRecords

UNION

--Set B
SELECT * 
FROM results
WHERE 
    resultSet = @setOfRecords AND
    resultSubset <> @subsetOfRecords

显示不正确,即

Set B
Set A

我知道这不是一个理想的方法,但是其他限制导致了这种实现的必要性。我的问题纯粹是关于为什么排序会受到 resultSubset ID 参数化的影响。

有任何想法吗?在 SQL Server 2008 上运行。

谢谢,保罗

4

2 回答 2

1

你为什么期待任何特定的订单?你没有包含一个ORDER BY子句。因此,SQL Server 可以自由地以它认为最有效的任何顺序返回行。

如果您想要一个可预测的顺序,请包含一个ORDER BY子句。如果你不包括一个,你是在告诉 SQL Server 你不关心顺序。

在这种情况下,您可以比较实际的执行计划,您可能会发现至少有一个排序运算符有所不同。这可能是由于多种原因造成的,包括参数嗅探、统计等...

于 2012-07-03T13:42:34.283 回答
0

除非您添加 ORDER BY 子句,否则无法保证结果的顺序。您可以添加一列来指示其上的集合和顺序吗?

根据您的评论更新,您是说您不能做这样的事情吗?

SET @setOfRecords = 1234
SET @subsetOfRecords = 4567 

--Set A
SELECT * 
FROM (
    select 'A' as TheSet, results.*
    from results) A
WHERE 
    resultSet = @setOfRecords AND
    resultSubset = @subsetOfRecords

UNION

--Set B
SELECT * 
FROM (
    select 'B' as TheSet, results.*
    from results) B
WHERE 
    resultSet = @setOfRecords AND
    resultSubset <> @subsetOfRecords

ORDER BY TheSet
于 2012-07-03T13:43:44.187 回答