1

ID マーカーとしてランダムな浮動小数点数を生成するストアド プロシージャがあり、呼び出されるとすぐに乱数 + .1 が履歴/ログ テーブルに格納され、最終結果が同じ乱数で格納されます。 number +.2 (シーケンサー/ソーターとして)。

ストアド プロシージャが常に適切に処理されていることを簡単に確認するために、これらのシーケンス番号 (以下の例のように) で満たされた列を動的にクエリし、それら (ペア) が偶数であることを確認する簡単な方法はありますか?

1568.1
1568.2
8452.1
8452.2
9886.1
9886.2
5455.1
3682.1
3682.2
4857.1
4857.2

上記のサンプル データでは、5455.1 の存在を警告するクエリが必要です。これは、ストアド プロシージャが呼び出しの結果 (成功または失敗)。

もちろん、問題/オッドボールが存在することを警告するだけでなく (単純にテーブルでカウントを実行し、それを判断するために数が偶数かどうかを確認できるため)、不一致を選択できるようにしたいと考えています。そのため、10,000 行の履歴/ログを並べ替えて、パートナーを持たないものを見つけることはしません。

4

2 に答える 2

1

まず、ID-Key は 1 列ではなく、2 列にする必要があります。つまり、代わりに

CREATE TABLE OneCol  (IDKey DECIMAL(6, 1) Primary Key);

次のようなものが必要です。

CREATE TABLE TwoCol  
(
    IDRand INT, 
    PhaseID TINYINT
    Primary Key  (IDRand, PhaseID)
)

これに加えて、探している特定の異常が {Phase=1) の ID であると仮定しますが、対応する {Phase=2} はありません。これは、クエリを記述する 1 つの方法です。

SELECT IDRand FROM TwoCol WHERE PhaseID = 1
EXCEPT
SELECT IDRand FROM TwoCol WHERE PhaseID = 2
于 2012-01-17T04:51:23.493 に答える
0

ここでの長さは申し訳ありませんが、次の人の助けになることを願っています...

上で提案したように、ランダム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ステートメントは、同様のデータ型の結果セットに同じ数のフィールドを持っている必要があります。

于 2012-01-17T15:15:10.343 に答える