0

嗨专家我需要实现一个 PL/SQL 函数 HIGHTRIP(LICENSENUM),它找到由驾驶执照号码标识的驾驶员执行的最长行程(表 DRIVER 中的 LNUM 属性和函数中的参数 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

“然而,上面的声明并没有显示没有出行的司机。”

没有任何行程的司机在 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. 一名司机的行程长度。如果我错了,请纠正我,但如果我要列出所有行程及其相关长度,这将是:

    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但是,此类异常被视为NULL来自 SQL,因此您可以按原样使用上述查询。

于 2012-11-23T16:58:57.667 回答