【发布时间】:2015-02-17 20:43:44
【问题描述】:
这可能是一个新手问题,但我终其一生都无法弄清楚。
在解释我的存储过程之前,我将描述我的表并展示示例。有一个TicketBook 表,其中包含已签发给一个单元的所有票本。 TicketBooks 有 25 张票长。
例如:
TicketBooks
-----------
TicketBookNum | TicketNum | UnitID | FirstTicket | LastTicket | Used
---------------------------------------------------------------------------
101 101 120 101 126 Yes
101 102 120 101 126 Yes
101 103 120 101 126 No
101 104 120 101 126 Yes
etc...
此表包含数据库中已使用和未使用的所有票证。
不同的票本可以同时发给不同的单位。所以 TicketBook 101 可以发给 Unit 120,而 TicketBook 151 可以发给 140。
我的存储过程需要做的是返回所有标记为未使用的票证,但也有一个大于标记为已使用的票证。
例子:
TicketBookNum | TicketNum | Used
----------------------------------
101 101 Yes
101 102 Yes
101 103 No
101 104 Yes
101 105 Yes
101 106 No
101 107 No
etc..
因此,存储过程返回票证103,但不返回106 和107,因为在票簿内没有票证在它们之后被标记为已使用。
这是我目前使用的存储过程:
select TicketNum
from TicketBooks
where Used='No'
and TicketNum between 92226 and 92251
and TicketNum < (select top 1 TicketNum
from TicketBooks
where Used='Yes'
and TicketNum between 92226 and 92251
order by TicketNum desc)
order by TicketNum desc
这将从 TicketBook 82226 返回丢失的票。如果我尝试更改 between 子句中的参数,则它不会返回正确的结果。任何帮助将不胜感激。
【问题讨论】:
-
只是一个不能解决您问题的评论:您应该只使用
max()而不是top 1和order by
标签: sql sql-server missing-data