0

より多くの試験を受けると試験のスコアが低くなるドライバーの名前を見つけるためのクエリを作成する必要があります。だから私は次のテーブルを持っています:

branch(branch_id, branch_name, branch_addr, branch_city, branch_phone);
driver(driver_ssn, driver_name, driver_addr, driver_city, driver_birthdate, driver_phone);
license(license_no, driver_ssn, license_type, license_class, license_expiry, issue_date, branch_id);
exam(driver_ssn, branch_id, exam_date, exam_type, exam_score);

**exam_dateは日付です

だから私はテーブルドライバーと試験を使用しています。どういうわけか、exam_date> anotherDateを確認すると同時に、exam_scoreを確認したいと思います。

*編集

これは私が思いついたものですが、構文の一部が違法であるように感じます。構文エラーが発生し続けます。

s.executeQuery("SELECT driver_name " +
"FROM driver " +
"WHERE driver.driver_ssn IN " +
"(SELECT e1.driver_ssn" +
"FROM exam e1" +
"WHERE e1.exam_score < " +
"(SELECT e2.exam_score FROM exam e2)" +
"AND e1.exam_date > " +
"(SELECT e2.exam_date FROM exam e2)");

EDIT! I got it working! Thanks for your input everyone!

SELECT driver.driver_name 
FROM driver
WHERE driver.driver_ssn IN
    (SELECT e1.driver_ssn 
    FROM exam e1, exam e2, driver d 
    WHERE e1.exam_score < e2.exam_score
    AND e1.exam_date > e2.exam_date 
    AND e1.driver_ssn=e2.driver_ssn)
4

3 に答える 3

1

自己結合を行う必要があります。この例を見て、自分のスキーマに合わせてください。

select d.name, 
       es.date_taken as 'prev date', 
       es.score as 'prev score',
       es.date_taken as 'new date', 
       es_newer.score as 'new score'
  from driver d
         inner join exam_score es
           on d.id = es.driver_id
         left outer join exam_score es_newer
           on d.id = es_newer.driver_id 
          and es_newer.date_taken > es.date_taken
          and es_newer.score < es.score
 where es_newer.id is not null

これは、デモ用に作成したSQL Fiddleです。

于 2012-11-09T13:59:02.390 に答える
0

この問題を単純に捉えると、2、3 回の試験を受けて 2 番目のスコアが低いドライバーを獲得することになります。

同じテーブルの列を比較するために、SQL は自己結合を使用します。結合条件には次が含まれている必要があります。

select e1.driver_ssn, e1.exam_type, e1.exam_score as score_before, 
       e2.exam_score as score_after
exam e1 join exam e2 on (e1.driver_ssn = e2.driver_ssn and 
                    e1.exam_type = e2.exam_type and
                    e1.exam_date < e2.exam_date and 
                    e1.exam_score > e2.exam_score)
于 2012-11-09T14:04:35.967 に答える
0

SELECT はセットを返し、単一の値をセットと比較することはできません。これらの線に沿って何かを試すことができます。これはあなたのものに似ており、3 つの試験ケースを処理しません:-

SELECT driver_name 
  FROM driver
  JOIN exam e1 ON driver_ssn
  JOIN exam e2 ON driver_ssn
 WHERE e1.exam_score < e2.exam_score
   AND e1.exam_date > e2.exam_date

クエリは、スコアが低く、日付が大きいドライバーが受験したすべての試験のペアを選択します

于 2012-11-09T13:46:28.800 に答える