【问题标题】:Retrieve rows from a database table (query error)从数据库表中检索行(查询错误)
【发布时间】:2012-10-03 06:23:27
【问题描述】:

我有一个带有表 book (id, name, display, priority) 的数据库

例如:

 ________________________________________________________
|    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 行并且显示为真

我使用这个存储过程来显示优先级为 1 和 2 和 3 的书籍(最具体的书籍)

问题:

  1. 当我尝试select top 3 order by priority 时,查询会获取优先级 = 1 的前 3 行,而我需要优先级 = 1 的 1 条记录和优先级 = 2 的 1 条记录和优先级 1 条记录= 3。

  2. 当我尝试获取 distinct book 时,distinct 适用于所有记录,而不是仅优先级

结果:

我需要这样的结果:

 ________________________________________________________
|    id    |    name    |    display    |    priority    |
 --------------------------------------------------------
|    4     |    test4   |     True      |       1        |
|    2     |    test2   |     True      |       3        |
|    5     |    test5   |     True      |       2        |
 --------------------------------------------------------

我该怎么做?

感谢帮助

【问题讨论】:

  • 我正在使用 sql server 2008 r2
  • 在优先级中,我们如何决定检索哪一行 - 我们(和 SQL Server)需要您定义我们可以遵循的实际规则。它不是“id 值最低的那个”,因为您为 priority 3 选择了 id 9,而不是 id 2。

标签: stored-procedures sql-server-2008-r2


【解决方案1】:

试试这个:

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

【讨论】:

  • 请问您能否解释一下这个查询?据我了解,您可以查看视图,然后从中获取信息。 over 是什么意思? partition 是什么?
  • 这可能会选择优先级为 4 或 5 的行,即使它确实选择了优先级为 1、2 和 3 的行,它也会选择优先级为 id 2 而不是 9 的行3.
  • 我在上面设置了一个例子,我需要查询来获取 3 条记录。 (第一个是找到的第一行查询,优先级为 1 或 2 或 3,display = true)(第二个是优先级为 1 或 2 或 3 且 display = true 的第二行查询)(第三个是找到优先级为 1 或 2 或 3 且 display = true 的第三行查询)
  • @Damien_The_Unbeliever:好点,我已根据您评论的第一部分更正了我的答案,关于第二部分,问题(不是您的问题,发布的问题)对此尚不清楚...
  • 我看到问题已更新为使用id 2,而不是现在的 9。不过,如果 OP 能够真正阐明规则,我会更高兴 - 即它现在 似乎 是“每个优先级中的最低 id 值”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 2022-01-16
  • 2014-06-29
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多