4

SQLServerバックエンドに対して次のクエリを実行しました

SELECT TOP(1) (v.rownum + 99)
FROM
    (
        SELECT incrementNo-99 as id, ROW_NUMBER() OVER (ORDER BY incrementNo) as rownum
        FROM proposals
        WHERE [year] = '12'
    )  as v
WHERE v.rownum <> v.id
ORDER BY v.rownum

最初の未使用の提案番号を検索します。(それは最後のレコード+1についてではありません)

しかし、私ROW_NUMBERはアクセスでサポートされていないことに気づきました。見てみましたが、似たようなものが見つかりません。

誰かがROW_NUMBERアクセスで同じ結果を得る方法を知っていますか?

たぶん、これを行うためのより良い方法があります。

実際、人々は制約なしに提案No(incrementID)を挿入します。この番号はこの13-152のように見えます。xx-は今年のもので、-xxxは提案番号です。最後の3桁は増分であると想定されていますが、場合によっては、年に10回、いくつかの数字をスキップする必要があります。そのため、自動インクリメントを行うことができません。

したがって、このクエリを実行して、フォームを開いたときに、デフォルトの番号が最初の未使用の番号になるようにします。

使い方:

数は100から始まるので、私は-99を実行し、1から始まります。

次に、行番号とIDを比較して、次のようにします。

ROW NUMBER      |       ID
1                        1                 (100)
2                        2                 (101)
3                        3                 (102)
4                        5                 (104)<--------- WRONG  
5                        6                 (105)

これで、4をスキップすることがわかりました。(4-99)=103を返します。

もっと良い方法があれば、変更してもかまいませんが、このクエリは本当に気に入っています。

他に方法がなく、アクセスで行番号をシミュレートできない場合は、パススルークエリを使用します。

ありがとうございました

4

2 に答える 2

4

あなたの質問から、あなたは数列のギャップを探しているようです、それで:

SELECT b.akey, (
    SELECT Top 1 akey 
    FROM table1 a 
    WHERE a.akey > b.akey) AS [next] 
FROM table1 AS b 
WHERE (
    SELECT Top 1 akey 
    FROM table1 a 
    WHERE a.akey > b.akey) <> [b].[akey]+1
ORDER BY b.akey

ここで、table1はテーブルで、akeyはシーケンス番号です。

于 2012-10-25T16:58:18.247 に答える
0
SELECT T.Value, T.next -1 FROM (
  SELECT b.Value , (
    SELECT Top 1 Value 
    FROM tblSequence a 
    WHERE a.Value > b.Value) AS [next] 
  FROM tblSequence  b  
) T WHERE T.next <> T.Value +1
于 2015-04-26T05:20:17.067 に答える