Stored procedures 从数据库表检索行(查询错误)

Stored procedures 从数据库表检索行(查询错误),stored-procedures,sql-server-2008-r2,Stored Procedures,Sql Server 2008 R2,我有一个数据库,其中有一个表book(id、名称、显示、优先级) 例如: ________________________________________________________ | id | name | display | priority | -------------------------------------------------------- | 1 | test1 | True

我有一个数据库,其中有一个表
book
id、名称、显示、优先级

例如:

 ________________________________________________________
|    id    |    name    |    display    |    priority    |
 --------------------------------------------------------
|    1     |    test1   |     True      |       5        |
|    2     |    test2   |     True      |       3        |
|    3     |    test3   |     False     |       4        |
|    4     |    test4   |     True      |       1        |
|    5     |    test5   |     True      |       2        |
|    6     |    test6   |     False     |       1        |
|    7     |    test7   |     True      |       1        |
|    8     |    test8   |     True      |       4        |
|    9     |    test9   |     True      |       3        |
|    10    |    test10  |     False     |       2        |
|    11    |    test11  |     True      |       3        |
|    12    |    test12  |     True      |       5        |
 --------------------------------------------------------
我需要编写一个查询,以仅获取优先级为1、2和3的3行,并且display为true

我使用此存储过程显示优先级为1、2和3的书籍(最特定的书籍)

问题

  • 当我尝试
    选择按优先级排序的前3行时
    查询将获得优先级为1的前3行,而我需要优先级为1的1-record和优先级为2的1-record以及优先级为3的1-record

  • 当我尝试获取
    不同的书籍时,不同的书籍会覆盖所有记录,而不仅仅是优先级

  • 结果:

    我需要的结果是:

     ________________________________________________________
    |    id    |    name    |    display    |    priority    |
     --------------------------------------------------------
    |    4     |    test4   |     True      |       1        |
    |    2     |    test2   |     True      |       3        |
    |    5     |    test5   |     True      |       2        |
     --------------------------------------------------------
    
    我该怎么做

    感谢您的帮助

    试试这个:

    with cte as (
         select *,row_number() over(partition by priority  order by id) as row_num
         from book
         where  display='true'
         and priority in (1,2,3)
         )
    select id,name,display,priority
    from   cte 
    where  row_num=1
    

    我正在优先使用sql server 2008 R2,我们如何决定检索哪一行?我们(和sql server)需要您定义我们可以遵循的实际规则。它不是“id值最低的一个”,因为您选择了
    id
    9作为
    priority
    3,而不是
    id
    2。请您解释一下这个查询?据我所知,你先创建一个视图,然后从中获取信息。
    over
    是什么意思?什么是
    partition
    ?它可以选择优先级为4或5的行,即使它选择了优先级为1、2和3的行,它也会选择id为
    2的行,而不是优先级为3的行。我在上面设置了一个示例,我需要查询以获得3条记录。(第一个是找到的优先级为1、2或3且显示=true的第一行查询)(第二个是找到的优先级为1、2或3且显示=true的第二行查询)(第三个是找到的优先级为1、2或3且显示=true的第三行查询)@Damien_不信者:好的观点,我已根据您评论的第一部分更正了我的答案,关于第二部分,问题(不是您的问题,发布的问题)对此不清楚……我发现问题已更新为使用
    id
    2,而不是现在的9。如果OP真的能清楚地表达规则,我会更高兴,也就是说,它现在看起来是“每个优先级中最低的
    id
    值”