1

私は誰かのためにプロジェクトを引き継ぎました。この時点で、私たちはアプリケーションを使用できるようにしようとしていますが、それを行う最善の方法について心配していません。そうは言っても、私が理解できない Cursor に問題があるようです。カーソル内の select ステートメントは 6 行を返します...

DECLARE testCursor cursor for 

select r.fldcode, r.rescode, r.[class], f.[print], r.[r print], f.[requestor], r.[r requestor]
    from field f INNER JOIN resv r 
    ON f.fldcode=r.fldcode
    where f.requestor = 'Admin Resdas' OR r.[r requestor] = 'Admin Resdas'

Open testCursor
Fetch Next from testCursor;

While @@FETCH_STATUS = 0
    BEGIN   
        PRINT 'IN HERE'
        Fetch Next FROM testCursor
    END

close testCursor
Deallocate testCursor

これを SQL Management studio で実行すると、そのまま実行されますが、「OR」を「AND」に変更すると、カーソルは問題なく実行されます。「OR」ステートメントで正しく実行されない原因は何ですか? 両方の列にデータが入力されていない場合があるため、「OR」が機能する必要があるのは、ステートメントが単独で正常に実行されるため意味がありません。

助けてくれてありがとう...

4

1 に答える 1

0

f.requestor および/または r.requestor には、「and」条件ではなく「or」条件でクエリを評価するために使用できるインデックスがある場合があります。(SQL Serverオプティマイザーがそのようなことについてどれほど賢いかはわかりません)

別々に実行された 2 つのクエリを結合してみると、同じ結果が返され、オプティマイザが混乱しているときに役立つことがあります。

select r.fldcode, r.rescode, r.[class], f.[print], r.[r print], f.[requestor], r.[r requestor]
    from field f INNER JOIN resv r 
    ON f.fldcode=r.fldcode
    where f.requestor = 'Admin Resdas'
union
select r.fldcode, r.rescode, r.[class], f.[print], r.[r print], f.[requestor], r.[r requestor]
    from field f INNER JOIN resv r 
    ON f.fldcode=r.fldcode
    where r.[requestor] = 'Admin Resdas'
于 2014-07-29T17:41:05.190 に答える