2016-10-26 4 views
0

私はこのコードを持っている(?):サブクエリは参加しない存在

SELECT b.id_book 
    INTO var_idbook 
    FROM ORDERS o 
    INNER JOIN SIGNATURES s 
    ON o.signature=s.signature 
    INNER JOIN BOOKS b ON s.id_book=b.id_book 
    WHERE ((b.genre=var_genre)) 
    GROUP BY b.id_book 
    ORDER BY COUNT(o.ID_ORDER) DESC 
    FETCH FIRST ROW ONLY; 

このコードは正常に動作し、それが目標は、特定のジャンルの中で最も人気のある本のid_bookを与えることであるのです。私は彼が一度読んだ本を彼に勧めたくないので、前にこの本を借りたかどうかチェックしたいと思います。 ID_ORDERID_READERSIGNATUREともテーブルSIGNATURES私はSIGNATUREID_BOOKを持って: は私が注文やattrubutesの歴史を持っているテーブルの名前ORDERSを持っています。私はこのメソッドを呼び出すときにID_READERを使用しますが、このコードを変更して履歴をチェックする方法はわかりません。 ご協力いただきありがとうございます。

答えて

1

あなたがWHERE句に存在しません使用することができます。

SELECT b.id_book 
    INTO var_idbook 
    FROM ORDERS o 
INNER JOIN SIGNATURES s 
    ON o.signature=s.signature 
INNER JOIN BOOKS b 
    ON s.id_book=b.id_book 
WHERE b.genre=var_genre 
    AND NOT EXISTS (SELECT 1 
        FROM ORDERS o2 
        INNER JOIN SIGNATURES s2 
         ON o2.signature = s2.signature 
        WHERE o2.id_reader = var_reader 
         AND s2.id_book = s.id_book) 
GROUP BY b.id_book 
ORDER BY COUNT(o.ID_ORDER) DESC 
FETCH FIRST ROW ONLY; 

私はそれをテストすることはできません、適切なデータセットを持っていないが、アイデアはにid_bookのルックアップを持っていることであるためにユーザーが注文してそれをフィルタリングするかどうかを確認してください。サブクエリはid_bookによって外部クエリに結合され、パラメータvar_readerがユーザの選択に使用されます。

EDIT:あなたはORDERBOOKSとの関係についての情報を提供していない

https://asktom.oracle.com/pls/apex/f?p=100:11:0::NO::P11_QUESTION_ID:442029737684

+0

をORDER_IDそして、それは何を意味する: "1 SELECT" を? – monterinio

+0

"SELECT 1"は、実際にカラムを返すことを心配していないことを意味し、存在の条件(WHERE句)をテストするだけです。 「SELECT NULL」と書いている人もいます。 –

+0

Asktomに関するディスカッションのために、EXISTS/NOT EXISTSについてのリンクを追加しました。これは少し詳細を明確にするのに役立ちます –

0

:上の興味深い議論については は、IN/EXISTS、NOTおよびIN/NOT EXISTS下記のリンクを参照してください。 MY前提としていますが、テーブルORDER_BOOK_LINKはbook_idであると

SELECT b.id_book 
    -- INTO var_idbook 
    FROM ORDERS o 
    INNER JOIN SIGNATURES s ON o.signature=s.signature 
    INNER JOIN BOOKS b ON s.id_book=b.id_book 
    WHERE b.genre=var_genre 
     AND NOT EXSITS (SELECT NULL 
         FROM ORDER_BOOK_LINK obl 
         WHERE obl.Order_id = o.D_ORDER 
         AND obl.book_id = b.id_book) 
    GROUP BY b.id_book 
    ORDER BY COUNT(o.ID_ORDER) DESC 
    --FETCH FIRST ROW ONLY 
    ; 
関連する問題