2

トリガーソリューションのいくつかがすでにこれをカバーしているが、私のシナリオでそれらを機能させることができない場合は、事前にお詫び申し上げます。

50,000行を超えるテーブルがあり、そのすべてにがありID、およそ5000の異なるID値があります。instrumentID = 1テーブル内などで100行と50行が存在する可能性がありますがinstrumentID = 2、列エントリはわずかに異なります。だから私は書くことができます

SELECT * from tbl WHERE instrumentID = 1 

100行を返すようにします(これは簡単なことですが、明確にするためです)

私がする必要があるのは、楽器IDが見つかるたびに増分値を作成することなので、次のようなものを試しました。

    IntIndex INT IDENTITY(1,1), 
    dDateStart DATE,
    IntInstrumentID INT,
    IntIndex1 AS IntInstrumentID + IntIndex,

テーブル作成ステップで。

ただし、レコードがテーブルのどこにあるかに関係なく、最後の値だけを見るだけでレコードのカウントを効果的に提供できるようIntIndex1に、が見つかったときに増分する必要があります。上記のように、テーブルのすべての行で増分されるのではなく、5001,4002,4003などを取得します。instrumentIDIntIndex1instrumentID

例は次のとおりです。intInstruments5000および4000の場合

intInstrumentID  | IntIndex1
--------- ------------------
    5000         |   5001
    5000         |   5002
    4000         |   4001
    5000         |   5003
    4000         |   4002

これを行う必要がある理由は、これらの値(それぞれの開始日と終了日instrumentID)に基づいて2つのテーブルを結合する必要があるためです。私はなどを試しGROUP BYましたが、これは両方のテーブルで機能せず、JOINは機能しません。

どうもありがとう

4

1 に答える 1

1

私はあなたの問題を完全に理解しているわけではありませんが、参加するためにIntIndex1が必要な場合は、データベースに計算値を実際に保持しようとするのではなく、次のクエリに参加できますか?

SELECT  *, 
        intInstrumentID + RANK() OVER(PARTITION BY intInstrumentID ORDER BY dDateStart ASC) AS IntIndex1
FROM    tbl

編集:私があなたのコメントを正しく理解している場合(これは確かではありません!)、おそらく、あなたはあなたの終了日と開始日のテーブルがまったく同じ行数を持っていることを知っています、それはそれらの間の1対1のマッピングにつながります機器ID内のそれぞれの終了日?

その場合は、おそらくこの結合があなたが探しているものです:

SELECT SD.intInstrumentID, SD.dDateStart, ED.dEndDate
FROM
(
    SELECT  intInstrumentID, 
            dStartDate, 
            RANK() OVER(PARTITION BY intInstrumentID ORDER BY dDateStart ASC) AS IntIndex1
    FROM    tblStartDate
) SD
JOIN
(
    SELECT  intInstrumentID, 
            dEndDate, 
            RANK() OVER(PARTITION BY intInstrumentID ORDER BY dEndDate ASC) AS IntIndex1
    FROM    tblStartDate
) ED
    ON  SD.intInstrumentID = ED.intInstrumentID
    AND SD.IntIndex1 = ED.IntIndex1

そうでない場合は、両方のテーブルのサンプルデータと期待される結果を投稿してください。

于 2012-12-05T13:43:50.917 に答える