ここでの長さは申し訳ありませんが、次の人の助けになることを願っています...
上で提案したように、ランダムIDを2つのフィールドに分割します。1つ目はランダムIDで、2つ目は「フェーズ」IDです。上記のexceptステートメントを使用すると、開始された(フェーズ1が存在する)が、2番目/完了フェーズが欠落しているランダムIDのリストが返されます。
ただし、各RIDを個別に検索することに時間を費やしたくないので、以下にコピーするように、EXCEPTステートメントをINステートメントでラップしました。これにより、実際に返されるフィールドを制御できます。
SELECT randomid, phaseid, info, type, time
FROM history
WHERE randomid IN (
SELECT randomid FROM history WHERE phaseid = '1'
EXCEPT
SELECT randomid FROM history WHERE phaseid = '2'
)
注:すべてを選択するように指定しているため、EXCEPTステートメントをラップすると、個別の部分(以下のリンクを参照)が無視されます。また、重複を防ぐために、乱数範囲を改善するか、日付コードを追加する必要があります。同じ乱数を2回取得したことがあり、1つが完了し、もう1つが失敗した場合、失敗したもの(フェーズ2がなかった)は、一致する完了フェーズの存在としてEXCEPTステートメントのクエリ結果に表示されません。 EXCEPT句を満たします。開始フェーズごとに完了フェーズがあることを確認するのではなく、ランダムIDが一致する完了フェーズが存在することだけを確認します。
ランダム化が不十分な番号スキームで重複が発生した場合、同じランダムIDを持つ16のエントリをテーブルに含めることができます(ランダムIDが1337であるとします)。RIDが1337のエントリの偶数は、エラーが偶数であったとしても問題ないように見えます(データベース内のエントリの偶数をチェックすることは、エラーをチェックするための良い方法ではないと思います。ただし、クエリの結果を確認するために、フェーズIDの数を1としてカウントし、pidが2のフェーズIDの数と比較することはできます)。これらの16のエントリのうち、6つが適切に完了し(フェーズ1とフェーズ2)、残りの4つが何らかの理由で失敗したとします。データベースにPIDが2のRID1337のエントリが存在するため、4つの障害のいずれも表示されません。
バリー、私を正しい方向に向けてくれてありがとう!
================================================== ======
次のリンクは、古いにもかかわらず、EXCEPT演算子の例を使用すると、他のサイトよりも少し深くなっているように見えます(すべての結果に対して、明確な結果のみが返されるという統計)。
http://www.databasejournal.com/features/mssql/article.php/3602601/Except-Operator-in-SQL-Server-2005.htm
================================================== ======
Pinal Daveによる演算子の一般的な要約:
JRの1つ。開発者は1日前に私に尋ねましたが、SQLServerにはOracleのMINUS句のような同様の操作がありますか。
絶対に、SQL ServerのEXCEPT句は、OracleのMINUS操作とまったく同じです。EXCEPTクエリとMINUSクエリは、2番目のクエリでは返されない最初のクエリのすべての行を返します。EXCEPTクエリおよびMINUSクエリ内の各SQLステートメントは、同様のデータ型の結果セットに同じ数のフィールドを持っている必要があります。