1

SQL Server データベースで非常に特殊な状況が発生し、昨日から検索を続けています... しかし、今はあきらめなければなりません。

私は

  • Documentテーブル (DocumentID (PK), ArchiveNoなど)

そして

  • LanguageVersionテーブル (など) は、 (1 つのドキュメントには (n) 個の言語バージョンがLanguageVersionID (PK), LanguageVersionID (FK), ReleaseDate, Languageあります) と 1 対 1 の関係があります。Document

ユーザー検索の後、ユーザーが表示できるリストが既にありDocumentます。ReleaseDateこれらは、表にある でソートする必要がありLanguageVersionます。

だから私はそれに参加LanguageVersionし、当然のことながらDocumentエントリの重複が発生し、この結果を でソートしReleaseDateDocumentID.

わかりました-これまでのところDocumentID、正しい順序で のリストを取得しましたが、重複があります。

結果を表示するには、これらの結果を 20 ページの !!Documents!! ごとにグループ化する必要があります。したがって、私は2つの可能な解決策を見つけました.ROW_NUMBER()-OVER()句またはSQL Server 2012には、ORDER-BY句の新しい拡張がありますOFFSETand FETCH NEXT.

問題は、範囲選択のベースとして行番号を生成するために、これらの両方が順序付け列を必要とすることです。

  • ReleaseDateこの順序付けの一時的な結果にを保持すると、 のすべての複製が異なるを持つDocumentIDため、 の区別は失敗します。DocumentIDReleaseDates

  • を切り落とすとReleaseDate、 を実行できますがDISTINCT、範囲インデックスを生成するための順序付け列が失われます。

私は非常にイライラしています。なぜなら、LIMIT順序付けなしで句を使用しても問題のない MySQL に慣れているからです。

SQL Server に同等のものはありませんか?

私はすでに文書の結果を正しい順序で持っていますが、唯一の問題は重複です。私が欲しいのはDISTINCT、 on でDocumentID、そこから x から y までの範囲を選択することだけです。

よろしくお願いします、クリス

4

1 に答える 1

0

セットアップがあれば、次のようなことができます。

  • CTE (Common Table Expression) を作成して、一度に 10、20のページを選択します。DocumentIDこれにより、必要DocumentIDな値とその数を指定できます

  • そのCTE(DocumentID必要な20ページに制限)をLanguageVersionテーブルに結合して、必要なデータの完全なセットを取得します

これにより、必要なものが得られます。正確に n を定義して取得しDocumentID(ページング用)、さらにLanguageVersionテーブルからすべての追加の詳細を取得します。

だからこれを試してください:

-- define the CTE, give it a name
;WITH DocumentPage AS
(
    -- define the rows to fetch - here, I'm using the ROW_NUMBER approach 
    SELECT 
        DocumentID ,
        ArchiveNo,
        RowNum = ROW_NUMBER() OVER(ORDER BY DocumentID)
    FROM dbo.Document
)
-- define the full query - get everything from the "paged" DocumentPage CTE,
-- plus the relevant details from the LanguageVersion table
SELECT  
    dp.DocumentID ,
    dp.ArchiveNo,
    lv.LanguageVersionID ,
    lv.ReleaseDate ,
    lv.Language
FROM 
    DocumentPage dp
INNER JOIN 
    dbo.LanguageVersion lv ON dp.DocumentID = lv.DocumentID
WHERE 
    dp.RowNum BETWEEN 51 AND 60 -- define which rows from the Document table you want
于 2013-06-07T10:24:32.180 に答える