SQL以字母顺序获取结果范围

| 我有一个表ѭ0,其工作方式与StackOverflows标记系统大致相同。 当我查看标签页面时,假设标签
Tutorial
我想按字母顺序显示其前后的10个标签。 因此,如果给我们提供ID为ѭ3the的标签
Tutorial
,我们如何以类似的顺序返回记录集:
Tap
Tart
> Tutorial
Umbrellas
Unicorns
Xylaphones
我认为,我曾想过这样做的方法,因为它们涉及检索丑陋的数据量。 我不确定是否可以按照(pseudo)做一些事情:
SELECT RANGE(0 - 30) FROM tblTags ORDER BY Name ASC
但是,如何在不遍历整个列表直到找到列表的情况下,如何有效地知道tutorial标签在列表中的位置? 我将SQL Server 2008 R2 Express与LINQ配合使用,如果有什么不同,SQL查询或LINQ将是一个很好的答案,谢谢!     
已邀请:
        建立在Jacob \的UNION建议的基础上,您可以使用表变量选择匹配的TagID \,然后针对Tag表重新联接以获取匹配的记录。它没有我想要的那么优雅,但确实可以工作。 附带说明一下,我认为UNION方法可行,但是AFAIK SQL Server仅允许在最后一个SELECT上使用ORDER BY,并且ORDER BY适用于整个结果集(此文章也指出了同样的意思)。
DECLARE @tags AS TABLE(TagID INT, Name VARCHAR(30))
INSERT INTO @tags VALUES(1, \'a\')
INSERT INTO @tags VALUES(2, \'b\')
INSERT INTO @tags VALUES(3, \'c\')
INSERT INTO @tags VALUES(4, \'d\')
INSERT INTO @tags VALUES(5, \'e\')
INSERT INTO @tags VALUES(6, \'f\')
INSERT INTO @tags VALUES(7, \'g\')
INSERT INTO @tags VALUES(8, \'h\')
INSERT INTO @tags VALUES(9, \'i\')
INSERT INTO @tags VALUES(10, \'j\')

DECLARE @selectedTags AS TABLE(TagID INT)
INSERT INTO @selectedTags
SELECT TOP 2 TagID FROM @tags WHERE Name < \'e\' ORDER BY Name DESC
INSERT INTO @selectedTags
SELECT TOP 2 TagID FROM @tags WHERE Name >= \'e\' ORDER BY Name

SELECT * 
FROM @tags T
JOIN @selectedTags ST ON ST.TagID = T.TagID
ORDER BY T.Name
    
        工会可能会起作用。 (我确定我有一些语法错误,但您明白了) (编辑:感谢评论和其他答案,尤其是rsbarro)
DECLARE @tags AS TABLE(TagID INT, tag VARCHAR(30))
INSERT INTO @tags VALUES(1, \'a\')
INSERT INTO @tags VALUES(2, \'b\')
INSERT INTO @tags VALUES(3, \'c\')
INSERT INTO @tags VALUES(4, \'d\')
INSERT INTO @tags VALUES(5, \'e\')
INSERT INTO @tags VALUES(6, \'f\')
INSERT INTO @tags VALUES(7, \'g\')
INSERT INTO @tags VALUES(8, \'h\')
INSERT INTO @tags VALUES(9, \'i\')
INSERT INTO @tags VALUES(10, \'j\');

select * from (select top(2) tag
from @tags
where tag < \'f\'
order by tag desc
) a

union

select * from (select top(3) tag
from @tags
where tag >= \'f\'
order by tag) b;
但是,我将进行性能检查,以查看是否确实比返回更多行然后过滤下来更快。我感觉有一种更高效的方法。     
        
With X As (select tblTag.*, Row_Number() Over(Order By tag) R_NUMB From tblTag )
Select tag From X
Where X.R_NUMB  Between (Select X.R_NUMB From X  Where tag = \'Tutorial\') - 10 
And (Select X.R_NUMB From X  Where tag = \'Tutorial\') + 10
    
        正如Jacob所建议的,我的想法完全相同,只有SQL Server会采用“前10名”而不是限制。
select top 3 * 
from names
where name<\'d\'
union
select top 3 * 
from names
where name>=\'d\'
order by name 
(在SQL Server 2008 R2上对此进行了测试) 编辑: 正确地指出,先前的查询未提供所需的结果。但是,此方法应该可能有更有效的方法来执行相同的操作。
select name from names
where name in (
    select top 3 name from names where name<\'e\' order by name desc
    )or name in (
    select top 3 name from names where name>=\'e\')
order by name 
    
        花了我一段时间来弄清楚,谢谢工会的想法。不太确定为什么这样做,, 11似乎需要大量的代码才能工作,不太确定为什么,这段代码似乎可以100%正常工作,并且每边需要5个代码:
var q = (
    from c in db.tblTags
    where
        !(from o in db.tblTagSynonyms
            select o.SynonymTagID)
        .Contains(c.ID)
        &&
        c.Name.CompareTo(AnchorTagName) < 1
    orderby c.Name descending
    select new
        {
            c.ID,
            c.Name,
            c.Priority,
            TotalResources = (from a in db.tblTagAnchors where a.TagID == c.ID select new { a.ID }).Count()
        }
    ).Take(7).ToArray().Reverse().Union(
    from c in db.tblTags
    where
        !(from o in db.tblTagSynonyms
            select o.SynonymTagID)
        .Contains(c.ID)
        &&
        c.Name.CompareTo(AnchorTagName) >= 1
    orderby c.Name ascending
    select new
    {
        c.ID,
        c.Name,
        c.Priority,
        TotalResources = (from a in db.tblTagAnchors where a.TagID == c.ID select new { a.ID }).Count()
    }
).Skip(1).Take(11).ToArray();
    

要回复问题请先登录注册