多くのベンダーの多くのトランザクションを含む Microsoft Access のトランザクション テーブルがあります。各ベンダーに連続したトランザクション番号が付けられているかどうかを確認する必要があります。シーケンスがどうなるか、またはベンダーごとのトランザクション数がわかりません。ベンダーの連番を識別し、存在する場合はフィールドを「1」に設定する SQL を作成する必要があります。最初にベンダーごとのトランザクション数を決定し、次にそれらのトランザクションをループしてトランザクション数を比較するネストされたループを実行することを考えていました。誰でもこれで私を助けることができますか??
3 に答える
これが最も簡単なアプローチかどうかはわかりませんが、うまくいくと思います。複数の手順を使用することをお詫びしますが、Jet 4.0 の種類では強制的にそうする必要があります。**
すべてのtransactionId
値は正の整数であり、シーケンスは によって等間隔に配置されたtransactionId
値のセットであると仮定しましたvendorId
。さらに、 にキーがあると仮定し(vendorId, transactionId)
ます。
最初のステップでは、無効な行を排除します。たとえば、シーケンスを決定できるようにするには、少なくとも 3 つの行が必要です (他のすべての行は成功するか失敗するか?)。ここでも他のジャンクを除外したい場合があります (例NULL
: 値を持つ行/グループ):
CREATE VIEW tbl1
AS
SELECT T1.vendorId, T1.transactionId
FROM tbl AS T1
WHERE EXISTS (
SELECT T2.vendorId
FROM tbl AS T2
WHERE T2.vendorId = T1.vendorId
GROUP
BY T2.vendorId
HAVING COUNT(*) > 2
);
各ベンダーの最低値を見つけます (後で役立ちます)。
CREATE VIEW tbl2
AS
SELECT vendorId, MIN(transactionId) AS transactionId_min
FROM tbl1
GROUP
BY vendorId;
transactionId_base_zero
各ベンダーの最低値を差し引いて、すべてのシーケンスをゼロ ( ) から開始します。
CREATE VIEW tbl3
AS
SELECT T1.vendorId, T1.transactionId,
T1.transactionId - T2.transactionId_min AS transactionId_base_zero
FROM tbl1 AS T1
INNER JOIN tbl2 AS T2
ON T1.vendorId = T2.vendorId;
に基づいてステップ値 (隣接するシーケンス値の差) を予測し、MAX
各ベンダーの値を設定しますMIN
。COUNT
CREATE VIEW tbl4
AS
SELECT vendorId,
MAX(transactionId_base_zero) / (COUNT(*) - 1)
AS transactionId_predicted_step
FROM tbl3;
予測されたステップ値が各シーケンス値、つまり (疑似コード) に対して真を保持することをテストします (前の値がないためthis_transactionId - step_value = prior_transactionId
、最小値を省略します!):transactionId
SELECT DISTINCT T.vendorId
FROM tbl3 AS T
WHERE T.transactionId_base_zero > 0
AND NOT EXISTS (
SELECT *
FROM tbl3 AS T3
INNER JOIN tbl4 AS T4
ON T3.vendorId = T4.vendorId
WHERE T.vendorId = T3.vendorId
AND T.transactionId_base_zero
- T4.transactionId_predicted_step
= T3.transactionId_base_zero
);
上記のクエリは、値が連続していないvendorId
ベンダーの を返す必要があります。transactionId
** 私の弁護では、Jet 4.0 でいくつかのバグに遭遇しました。回避策をコーディングする必要がありました。はい、私はバグが Jet 4.0 (またはその OLE DB プロバイダー) にあることを知っています。なぜなら、a) SQL Server を使用して結果を再確認し、b) ロジックに逆らっているからです! (SQL 独自の奇妙な 3VL ロジックでさえ :)
1 つの連続したセット (一方のトランザクション番号が他方に続く 2 つのレコード) を検索するには:
SELECT transactionId FROM tbl WHERE EXISTS
(SELECT * FROM tbl as t WHERE tbl.vendorId = t.vendorId
AND tbl.transactionId+1 = t.transactionId)
任意のベンダーのナンバリングのギャップを見つけるクエリを使用します。それがレコードを返す場合、すべてのベンダーの連続したナンバリングはありません。
SELECT *
FROM tblTransaction As T1
WHERE (
SELECT TOP 1 T2.transactionID
FROM tblTransaction As T2
WHERE T1.vendorID = T2.vendorID AND
T1.transactionID < T2.transactionID
ORDER BY T2.transactionID
) - T1.transactionID > 1
これが行うことは、テーブル内の各レコードに対して、同じベンダーの同じテーブル内の最小番号の他の transactionID を探し、最初のものよりも大きい番号の transactionID を持つことです。そのレコードの transactionID 値が最初のレコードの値よりも 2 つ以上大きい場合は、ベンダーの番号付けにギャップがあることを表します。
編集:要求に応じて上記の変数名を変更しました。