sql – 如何从两个查询的并集中选择最上面的n,其中生成的顺序需要通过单独查询进行排名?

前端之家收集整理的这篇文章主要介绍了sql – 如何从两个查询的并集中选择最上面的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)

这是否可能在单个查询中?

解决方法

您可以使用案例将准确的匹配项放在顶部:
select  top 4 *
from    Usernames
where   Name like '%Bob%'
order by
        case when Name = 'Bob' then 1 else 2 end

或者,如果您担心性能并且有一个索引(名称):

select  top 4 *
from    (
        select  1 as SortOrder,*
        from    Usernames
        where   Name = 'Bob'
        union all
        select  2,*
        from    Usernames
        where   Name like  '%Bob%'
                and Name <> 'Bob'
                and 4 >
                (
                select  count(*)
                from    Usernames
                where   Name = 'Bob'
                )
        ) as SubqueryAlias
order by
        SortOrder

猜你在找的MsSQL相关文章