SQL命令返回意外的结果

时间:2016-11-28 20:37:11

标签: sql database stored-procedures

我遇到过很久以前写过的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

这是我们的数据库表如何布局的快速示例: enter image description here

因此理论上,应在此报告中显示票号525。实际发生的是报告中显示从票号493(数据库中的第一张票证)到550(此类型的最后一张票证)的所有记录,即使除了525之外的所有记录都设置为{ {1}}

我不完全理解此过程如何返回列Used设置为Used的所有记录。

非常感谢任何帮助。

2 个答案:

答案 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)