1

我的 SQL Server 数据库遇到了一个非常奇特的情况,从昨天开始就一直在搜索……但我现在必须放弃。

我有一个

  • Document表(DocumentID (PK), ArchiveNo等...)

和一个

  • LanguageVersion表 (LanguageVersionID (PK), LanguageVersionID (FK), ReleaseDate, Language等...) 与Document(1 Document has (n) LanguageVersions) 有:1 关系。

在用户搜索之后,我已经有了一个Document允许用户查看的列表。这些必须按ReleaseDate位于LanguageVersion表中的 排序。

所以我加入LanguageVersion了它,自然导致Document条目重复,将这个结果排序ReleaseDate并切断除DocumentID.

好的 - 到目前为止,我得到了一个DocumentID按正确顺序排列的 's 列表,但有重复。

现在为了显示结果,要求将这些结果按 20 页!!Documents!! 分组。因此,我找到了 2 个可能的解决方案:无论是该ROW_NUMBER()-OVER()子句还是 SQL Server 2012 中都有ORDER-BY带有OFFSETand的子句的新扩展FETCH NEXT

问题是,这两个都需要一个排序列来生成行号作为范围选择的基础。

  • 如果我ReleaseDate将此排序保留在我的临时结果中,则DocumentID' 的区别将失败,因为 a 的每个副本DocumentID都有不同的ReleaseDates

  • 如果我切断ReleaseDate,我可以这样做,DISTINCT但会丢失用于生成范围索引的排序列。

我很沮丧,因为我习惯了 MySQL,在LIMIT没有任何排序的情况下使用子句没有问题。

SQL Server 中没有任何等价物吗?

我已经按照正确的顺序获得了文档结果,唯一的问题是重复。我想要的是:DISTINCTon DocumentID,然后从中选择从 x 到 y 的范围。

提前问候和感谢,克里斯

4

1 回答 1

0

Given your setup, you can do something like this:

  • create a CTE (Common Table Expression) to select a page of DocumentID - 10, 20 at a time - whatever works for you. This gives you the ability to specify how many and which DocumentID values you want

  • join that CTE (limited to the page of 20 DocumentID you want) with the LanguageVersion table, to get the full set of data you want

This gives you what you want: define and get exactly n DocumentID's (for paging), plus all the additional details from the LanguageVersion table.

So try this :

-- 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 回答