如何从两个查询的联合中选择前n个,需要根据单个查询对结果顺序进行排序?
|
假设我有一个包含用户名的表:
Id | Name
-----------
1 | Bobby
20 | Bob
90 | Bob
100 | Joe-Bob
630 | Bobberino
820 | Bob Junior
我想返回名称为\'Bob \'的n
个匹配项的列表,其中结果集首先包含完全匹配项,然后是相似的匹配项。
我以为这样的事情可能有用
SELECT TOP 4 a.* FROM
(
SELECT * from Usernames WHERE Name = \'Bob\'
UNION
SELECT * from Usernames WHERE Name LIKE \'%Bob%\'
) AS a
但是有两个问题:
这是一个效率低下的查询,因为子选择可能返回许多行(查看执行计划显示联接发生在顶部之前)
(几乎)更重要的是,由于结果集似乎按主键排序,因此精确匹配将不会首先出现在结果中。
我正在寻找将返回的查询(针对TOP 4)
Id | Name
---------
20 | Bob
90 | Bob
(and then 2 results from the LIKE query, e.g. 1 Bobby and 100 Joe-Bob)
在单个查询中有可能吗?
没有找到相关结果
已邀请:
6 个回复
提孺局缎
将精确匹配项放在顶部:
或者,如果您担心性能并在
上建立索引:
祁澈盘哼颗
匹配的附加UNION,并将此优先级设置为2,将
优先级更改为3,这样您将获得更好的搜索恕我直言。
长拳
佃蒜狗掂哥
款去芳尾脊
公藕
您要做的是删除子查询中的\“ @ \”符号,然后将其与外部查询一起添加回去。像这样:
这是我最终查询的简化版本,因此它没有任何意义,但是您应该明白这一点。