0

専門家の皆様、運転免許証番号 (テーブル DRIVER の LNUM 属性と関数のパラメーター LICENSENUM パラメーター) で識別されるドライバーによって実行された最長の旅行を見つける PL/SQL 関数 HIGHTRIP(LICENSENUM) を実装する必要があります。トリップを行わないドライバーについても表示する必要があります。

これは私がこれまでに行ったことです。

SELECT DRIVER.LNUM AS LICENSE_NO,
COUNT(TRIP.TNUM) AS TOTAL_NO_TRIPS
FROM DRIVER
LEFT OUTER JOIN TRIP
ON DRIVER.LNUM = TRIP.LNUM
INNER JOIN TRIPLEG
ON TRIP.TNUM = TRIPLEG.TNUM
GROUP BY DRIVER.LNUM
ORDER BY DRIVER.LNUM

ただし、上記のステートメントでは、乗車していない abt ドライバーは表示されません。

上記の基準を満たす関数にステートメントを変換する方法がわかりません。

4

2 に答える 2

0

「ただし、上記のステートメントは、乗車したことのない abt ドライバーを表示していません。」

乗車のないドライバーは、TRIPLEG に記録がありません。したがって、そのテーブルの INNER JOIN は、DRIVER と TRIP の間の OUTER JOIN をオーバーライドし、家にいるドライバーを除外します。

あなたがする必要があるのは次のようなものです:

SELECT DRIVER.LNUM AS LICENSE_NO,
       TRIPS.TOTAL_NO_TRIPS
FROM DRIVER
LEFT OUTER JOIN ( SELECT TRIP.LNUM,
                         COUNT(TRIP.TNUM)  AS TOTAL_NO_TRIPS
                  FROM TRIP
                       INNER JOIN TRIPLEG
                       ON TRIP.TNUM = TRIPLEG.TNUM
                       GROUP BY TRIP.LNUM ) TRIPS
    ON DRIVER.LNUM = TRIPS.LNUM
ORDER BY DRIVER.LNUM 
/

また、コードで小文字を使用する方法を学ぶことも必要です。完全に大文字で書かれたプログラムは、読みにくいため、COBOL で廃止されました。

于 2012-11-24T10:24:10.580 に答える
0

最初にクエリ全体を記述しようとするのではなく、要件を分割して、最も単純な部分から始めて構築することをお勧めします。クエリはTRIPLEG、特定のドライバーのテーブル内の行数を返しますが、要件に答えていないようです。また、 PL/SQL のドキュメント、特にCREATE FUNCTION 構文といくつかのを参照することをお勧めします。

たとえば、次のサブタスクで問題を分類します。

  1. 1 人のドライバーの移動距離。間違っていたら訂正してください。すべての旅行を関連する長さと一緒にリストするとしたら、次のようになります。

    SELECT t.tnum, COUNT(*) length
      FROM trip t
      JOIN tripleg tl ON t.tnum = tl.tnum
     WHERE t.lnum = :LNUM
     GROUP BY t.tnum
    
  2. 次の中から最長の旅行を選択してください:

    SELECT tnum
      FROM (SELECT t.tnum, COUNT(*) length
               FROM trip t
               JOIN tripleg tl ON t.tnum = tl.tnum
              WHERE t.lnum = :LNUM
              GROUP BY t.tnum
              ORDER BY COUNT(*) DESC)
       WHERE rownum = 1
    
  3. この結果を返す関数を書きます:

    CREATE OR REPLACE FUNCTION hightrip (p_lnum trip.lnum%type) 
       RETURN trip.tnum%type IS
       l_result trip.tnum%type;
    BEGIN
       SELECT tnum
         INTO l_result
         FROM (SELECT t.tnum, COUNT(*) length
                  FROM trip t
                  JOIN tripleg tl ON t.tnum = tl.tnum
                 WHERE t.lnum = p_lnum
                 GROUP BY t.tnum
                 ORDER BY COUNT(*) DESC)
          WHERE rownum = 1;
       RETURN l_result;
    END hightrip ;
    
  4. SELECT でこの関数を使用します。

    SELECT d.*, hightrip(d.lnum)
      FROM driver d;
    

このHIGHTRIP関数は、トリップのないドライバーNO_DATA_FOUNDから呼び出されると例外を生成します。PL/SQLただし、そのような例外は SQL からのものとして扱われるNULLため、上記のクエリをそのまま使用できます。

于 2012-11-23T16:58:57.667 に答える