2012-03-12 9 views
0

私はSQLを初めて使い、このクエリを開始することさえ問題があります。
SQL:IDのサブセットの以前のすべてのレコードを検索

生徒に「2012」のレコードがある場合は、そのレコードと以前のすべてのレコードをリストします。

簡略化されたデータセット:

ASSIGNMENTS 

STUDENT_ID BOOK_TITLE TERM 

         
 
001 MOBY DICK 2009 002 ULYSSES 2009 003 HAMLET 2009 004 1984 2009 005 HAMLET 2009 004 WAR & PEACE 2010 003 THE TRIAL 2010 004 MOBY DICK 2011 001 -NULL---- 2012 004 -NULL---- 2012

結果は、その生徒の前の記録に続いて与えられる用語で登録されたものを記録する必要があります。目標は、現在登録されている学生(書籍のタイトルのNULL値)を見て、すでに読んだ本を割り当てないようにすることです。

 
STUDENT_ID BOOK_TITLE TERM 
001   -NULL---- 2012 
001   MOBY DICK 2009 
004   -NULL---- 2012 
004   MOBY DICK 2011 
004   WAR & PEACE 2010 
004   1984   2009 

すべてのポインタ/開始の指示は非常に高く評価されます!私は 'with'、複数の内部結合を使いこなそうとしましたが、どこにもいません。私はSQLで実際には動作しないif..then構文を考え続けますか?

+0

どのデータベースエンジン(およびバージョン)を使用していますか? – Lamak

+0

Oracle SQL Developer 3.0を使用しています – Kate

答えて

2
SELECT STUDENT_ID, BOOK_TITLE, TERM 
    FROM ASSIGNMENTS 
    WHERE STUDENT_ID IN 
    (SELECT DISTINCT STUDENT_ID FROM ASSIGNMENTS WHERE TERM = 2012) 
    ORDER BY STUDENT_ID, TERM DESC 

この回答を最初に出すには、期待した結果フォーマットと一致するクエリを作成しました。次に、「現在登録されている学生のみ」の基準を追加しました。 WHERE BOOK_TITLE IS NULL

+0

ありがとうございます!これは完全に機能します。私は完全に自分自身の前に結合を考えていた。 – Kate

0

を使用して

あなたはそれではなく、2012年の@Termを入れてパラメータ化したい場合にもオフにそれを実行する可能性がnullの本のタイトルは、私はそれらの-NULL ----の値が実際の値を表しているかどうかわかりませんか、 NULL値。

SELECT student_id, book_title, term 
    FROM assignments 
WHERE student_id IN (SELECT student_id FROM assignments WHERE book_title IS NULL) 

良い方法は学生が現在の年の任期で登録されているかどうかに基づいてデータを取得するために、次のようになります。後者を想定すると、ここでそれを行うための一つの方法です。その方法は、RDBMSとバージョンによって異なります。

関連する問題