2016-11-28 6 views
0

かなり前に書いたSQLプロシージャに問題があります。この手順は、データベース内のすべての不足レコードを表示するレポートを生成するように設計されています。予期しない結果を返す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を除くすべてのレコードがUsed

Usedの列がYesに設定されているレコードをこのプロシージャが返す方法を完全に理解できません。

ご協力いただきまして誠にありがとうございます。

+0

'a.BookType in( 'Truck'、 'Work') ' – Hogan

答えて

2

それだけで括弧を欠けている、あなたはあなたの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') 

ます:

and (a.BookType='Truck' or a.BookType='Work') 
+0

ああ、うわー。私はそれを逃したとは信じられません。私はこの問題をあまりにも長く始まっています。 –

+0

とにかく、うまくいってくれてありがとう!私は9分で受け入れて答えることができます。 –

+1

あまりにも頻繁に私に起こる、私がチェック最初に! –

1

私はあなたがちょうどあなたのWHERE句を修正する必要があると思います持っていた:

WHERE A and B or C 

私はあなたが意味すると思う:

WHERE A and (B or C) 
+0

これは正解です。私はかなりシンプルなものを見逃すようでした! –

関連する問題