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句を含めます。これを含めない場合は、順序を気にしないことをSQLServerに伝えていることになります。

この場合、実際の実行プランを比較でき、少なくとも1つのソート演算子に違いが見つかる可能性があります。これは、パラメータのスニッフィング、統計など、さまざまな理由が原因である可能性があります。

于 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 に答える