各履歴エントリが一致していることを確認するためのSQLクエリ(動的?)
-
29-10-2019 - |
質問
IDマーカーとしてランダムフロート数を生成するストアドプロシージャがあり、それが乱数 + .1を履歴/ロギングテーブルに保存するとすぐに、最終結果は同じランダムで保存されます番号+.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の存在にアラートするクエリが必要です。これは、ストアドプロシージャがコールの結果(成功または成功または)で2番目のエントリを記録するときに常に持つべき2番目の部分(5455.2)がある必要がないためです。失敗)。
もちろん、問題/オッドボールが存在することを警告するだけでなく(単にテーブルでカウントを実行し、数字がそれを決定するかどうかを確認できるので)、ミスマッチを選択できるようにしたいですから、私はパートナーがいないものを見つけるために、10,000行の歴史/ログを並べ替えていません。
解決
まず、IDキーは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
他のヒント
ここでの長さは申し訳ありませんが、それが次の人が来るのを助けるかもしれないことを願っています...
上記のように、ランダムIDを2つのフィールドに分割します - 最初のフィールドはランダムIDを使用し、2番目は「フェーズ」IDを使用します。上記の除外ステートメントを使用して、開始されたランダムIDのリスト(フェーズ1が存在する)を返しますが、2番目の/完了フェーズが欠落しています。
しかし、私はそれぞれのRIDを個別に調べるのに時間を費やしたくないので、以下にコピーされたように、intatement in in statementに声明を巻き付けました。これにより、実際にどのフィールドが返されるかを制御できます。
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'
)
注:私がすべてを選択するように指定しているため、私が異なる部分(以下のリンクを参照)で結果を導いたように、除外ステートメントをラッピングします(以下のリンクを参照)。また、複製を防ぐために、乱数の範囲を改善するか、または日付コードを追加する必要があります。たまたま同じ乱数を2回取得し、1つが完了して失敗した場合、障害が発生した場合(フェーズ2を持っていなかった)ものは、一致する完了フェーズの存在として、ステートメントクエリの結果に表示されません。除外を満たします。すべての開始フェーズに完了フェーズがあることを確認することはチェックされておらず、一致するランダムIDを持つ完了フェーズがまったく存在することだけです。
重複したランダム化数スキームが不十分な場合、同じランダムIDを使用してテーブルに16のエントリがある可能性があります(ランダムIDは1337であるとします)。 1337を削除した偶数のエントリは、偶数のエラーがあるだけであっても大丈夫に見えます(データベースの偶数のエントリをチェックすることは、実際にエラーをチェックする良い方法ではありません。そのうちに、1つのフェーズIDの数を数えて、クエリの結果を確認するためにPIDのPIDを持つ人のカウントと比較することができました)。これらの16のエントリのうち、6つが適切に完了し(フェーズ1とフェーズ2)、残りの4つが何らかの形で失敗したとしましょう。データベースのエントリは、PIDが2のPIDを使用してRID 1337に存在していたため、4つの障害のいずれも表示されませんでした。
正しい方向に私を向けてくれてありがとう、バリー!
========================================================
以下のリンクは、他のサイトよりもオペレーターの例を除くよりももう少し深くなっているように見えました。
========================================================
ピナルデイブの将軍 要約 オペレーターの:
JRの1つ。開発者は1日前に私に尋ねました、SQL ServerにはOracleのMinus句のような同様の操作がありますか?
絶対に、SQL Serverの句は、Oracleのマイナス操作にまったく似ています。クエリとマイナスクエリを除いて、2番目のクエリでは返されない最初のクエリのすべての行を返します。クエリとマイナスクエリ内の各SQLステートメントには、同様のデータ型を持つ結果セットに同じ数のフィールドが必要です。