获取缺失记录存在之前和之后的记录

时间:2015-02-13 22:51:12

标签: sql exists

我在构建一个查询时遇到问题,该查询显示存在之前和之后的记录的缺失记录。例如:

Ticket #
  123
  125

我想要回归的是:

  124

我要比较的表格为TicketsTicketBooks。门票包含所有使用过的门票,而TicketBooks包含已经发出的所有门票(已使用且可能未使用)。我正在使用的当前查询显示所有丢失的记录。

select TicketNum, TicketBookNum, UnitID, DateIssued, IssuedBy
from TicketBooks
where not exists(select TicketNum
             from Tickets 
             where Tickets.TicketNum=TicketBooks.TicketNum)

当用户发出TicketBook时,会发出25张Tickets。因此,如果发行了第一本书并且使用了票证100-110并且已经使用了112,我希望查询返回:

Ticket #
  111

我不希望查询返回113,114,115等...任何想法都将不胜感激。

此外,门票可以发给多个单位,因此一个单位可以有1-25张票,而另一个单位可以有200-225张票。这使我无法将搜索限制为最高票证。

TicketBooks中的数据不包含最小和最大票证。表中的值如下:

  TicketBooks
  -------------
  TicketBookNum
  TicketNum
  UnitID
  Active

2 个答案:

答案 0 :(得分:4)

如果我理解正确,您希望将丢失的票证限制为最大使用值之前的票证:

select tb.TicketNum, tb.TicketBookNum, tb.UnitID, tb.DateIssued, tb.IssuedBy
from TicketBooks tb
where not exists (select 1
                  from Tickets t
                  where t.TicketNum = tb.TicketNum
                 ) and
      tb.TicketNum < (select max(tb2.TicketNum) from TicketBooks tb2);

答案 1 :(得分:0)

我相信以下查询是您想要的:

select TicketNum, TicketBookNum, UnitID, DateIssued, IssuedBy
from TicketBooks
where TicketNum not in (select TicketNum from Tickets) 
AND TicketNum + 1 in (select TicketNum from Tickets) 
AND TicketNum - 1 in (select TicketNum from Tickets) 

此查询将显示所有“TicketBooks”记录,这些记录没有相应的“Tickets”记录,并且在TicketNum之前和之后具有“Tickets”记录。