1

頭が真っ白になりました...小さなスクリプトを書こうとしているのに明らかな何かが欠けています:

さまざまな ID を持つ 1 つのテーブルがあります。

TBL_USETHISID
nextid int

参照のある別のテーブルがあります。

TBL_REFS
ref varchar(6)
thisdate datetime
nextid int

TBL_USETHISID から ID を取得し、TBL_REFS を更新して、各行の ID が前のものよりも 1 つ大きくなるようにします。次に、TBL_REFS から max(nextid) を選択し、TBL_USETHISID を最高値で更新します。

これらの ID は複数のテーブルで使用されるため、自動インクリメント フィールドの代わりにこれを使用する必要があります。

明らかに私は試しました:

UPDATE TBL_REFS FROM TBL_USETHISID
SET nextid = TBL_USETHISID.nextid + 1

事前にご協力いただきありがとうございます。

編集 - サンプルデータ:

TBUSETHID:

nextid
7001

TBL_REFS

ref       thisdate               nextid
0000123   2012-10-02 00:00:00        
0000124   2012-10-02 00:00:00 
0000125   2012-10-02 00:00:00 

更新後:

TBL_REFS

ref       thisdate               nextid
0000123   2012-10-02 00:00:00    7001    
0000124   2012-10-02 00:00:00    7002
0000125   2012-10-02 00:00:00    7003

次に、UPDATE TBL_USETHISID FROM TBL_REFS を nextid = max(a.nextid)+1 に設定して、元のテーブルを更新します。フォーマットが正しいことを願っています。読みやすくするためにコードのように識別しました。

4

3 に答える 3

0

これを試して、

UPDATE tbl_refs  SET nextid=(SELECT nextid+1 FROM tbl_usethisid)
于 2014-05-12T10:35:54.147 に答える
0

LOOPS最も効率的な方法ではありませんが、最も簡単な方法はスルーです。ingres私はそれに取り組んだことがないので、構文についてもわかりません。

CTE を使用することもできます (CTE が ingres で機能するかどうかは不明です)。そのための解決策も試してみます。

それまでは以下のコードを確認してください

--simulated table structure
DECLARE @TBLUSETHISID TABLE
(
    nextid INT
)

DECLARE @TBL_REFS TABLE
(
    ref varchar(6),
    thisdate datetime,
    nextid int
)

-- values for testing
INSERT INTO @TBLUSETHISID VALUES(7001);

INSERT INTO @TBL_REFS VALUES('000123', '2012-10-02 00:00:00', null);
INSERT INTO @TBL_REFS VALUES('000124', '2012-10-02 00:00:00', null);
INSERT INTO @TBL_REFS VALUES('000125', '2012-10-02 00:00:00', null);

--solution starts from here
DECLARE @StartCount INT, @TotalCount INT, @REF VARCHAR(6)

SELECT @TotalCount = COUNT(*) - 1 FROM @TBL_REFS;
SET @StartCount = 0;

WHILE(@StartCount <= @TotalCount)
BEGIN
    SELECT @REF = ref FROM (SELECT ROW_NUMBER() over(ORDER BY ref) AS ROWNUM, * FROM @TBL_REFS) as tbl WHERE ROWNUM = @StartCount + 1

    UPDATE @TBL_REFS
    SET nextid = (SELECT nextid + @StartCount FROM @TBLUSETHISID)
    WHERE ref = @REF

    SET @StartCount = @StartCount + 1

END

UPDATE @TBLUSETHISID
SET nextid = (SELECT MAX(nextid) + 1 FROM @TBL_REFS)

SELECT * FROM @TBLUSETHISID
SELECT * FROM @TBL_REFS

編集: よりも優れたソリューションLOOP。テーブル シミュレーションとテスト値の挿入は、上記のソリューションのままです。もちろん、 の問題はIngres doesn't support scalar queries残っているので、これに対する回避策を見つける必要があります。

UPDATE tbl2
SET nextid = (tbl.nextid + ROWNUM - 1) 
FROM
(SELECT ROW_NUMBER() over(ORDER BY ref) AS ROWNUM, 
ref,
thisdate,
(SELECT nextid FROM @TBLUSETHISID) AS nextid FROM @TBL_REFS) tbl
INNER JOIN @TBL_REFS tbl2
ON tbl.ref = tbl2.ref

お役に立てれば

于 2014-05-12T10:49:43.937 に答える