我遇到过很久以前写过的sql程序的问题。该过程旨在生成一个报告,显示数据库中所有缺失的记录。
例如,如果已使用票号10,11和13,则该过程应返回报表上的票号12。
我们管理每张票券,并在一个人拿出票据时相应地发出。签发票证时,书中的所有25张票都在数据库中创建,当每张票都输入数据库时,票据被标记为已使用。这是程序检查使用和不使用故障单的方式。
这是我们正在使用的当前程序
create procedure FindMissingTickets
as
select TicketNum, TicketBookNum, UnitID, DateIssued, IssuedBy
from TicketBooks a
where a.Used='No'
and a.TicketNum < (select MAX(b.TicketNum)
from TicketBooks b
where b.Used='Yes'
and b.UnitID=a.UnitID
and b.BookType='Truck' or b.BookType='Work')
and a.BookType='Truck' or a.BookType='Work'
order by TicketNum desc
go
因此理论上,应在此报告中显示票号525。实际发生的是报告中显示从票号493(数据库中的第一张票证)到550(此类型的最后一张票证)的所有记录,即使除了525之外的所有记录都设置为{ {1}}
我不完全理解此过程如何返回列Used
设置为Used
的所有记录。
非常感谢任何帮助。
答案 0 :(得分:2)
它只是缺少括号,你需要在where子句的最后部分放置括号:
and (a.BookType='Truck' or a.BookType='Work')
答案 1 :(得分:1)
我认为您只需要修复WHERE子句:
where a.Used='No'
and a.TicketNum < (select MAX(b.TicketNum)
from TicketBooks b
where b.Used='Yes'
and b.UnitID=a.UnitID
and b.BookType='Truck' or b.BookType='Work')
and (a.BookType='Truck' or a.BookType='Work')
你有:
WHERE A and B or C
我认为你的意思是:
WHERE A and (B or C)