2

コードを実行しました

SELECT CASE b.ON_LOAN
    when 'Y' then
        'In Lib'
    when 'N' then 
        (SELECT c.duedate from book_copy a, book b, loan c
            where b.isbn = 123456
            and a.isbn = b.isbn 
            and a.book_no = c.book_no)
    END AS Availability, a.isbn, a.class_number 
FROM book_copy b, book a
where a.isbn = b.isbn and a.isbn = 123456

サブクエリが複数の行を返すというエラーを返します。本の入手可能性を取得しようとしています。book_no によって識別される本には、複数のコピーを含めることができます。コピーが利用可能な場合は、'In lib' だけで再実行する必要があります。それ以外の場合は、loan テーブルからの期日です。たとえば、書籍に 3 つのコピーがあり、2 つがライブラリにあり、1 つがライブラリにある場合、クエリで 3 つすべてのコピーを表示する必要があります。外部結合が欠落していると思います。明確にしてください。

これに使用するテーブルは

book_copy: book_no, isbn, on_loan
loan: student_id, book_no, duedate,datereturned,loan_id
    fk: book_no with book_no in book_copy
book: isbn (pk), title, class

ありがとう、rk

4

2 に答える 2

10

問題は次のとおりです。

(SELECT c.duedate from book_copy a, book b, loan c where b.isbn = 123456 and a.isbn = b.isbn and a.book_no = c.book_no)

実際にはローン テーブルのみが必要ですが、MAX を使用して 1 行のみが返されるようにします。

(SELECT MAX(c.duedate) from loan c where a.book_no = c.book_no)

したがって...外側のクエリでテーブルにフックできます-aとbを再度使用する必要はありません。

ロブ

于 2009-08-25T10:53:35.573 に答える