2012-11-23 62 views
0

嗨,我需要實現PL/SQL函數HIGHTRIP(LICENSENUM),它可以查找駕駛執照號所標識的駕駛員執行的最長行程(表DRIVER中的LNUM屬性和函數中的參數LICENSENUM參數)。我需要顯示不執行任何行程的驅動程序。如何在sql語句中創建PLSQL函數和錯誤

這就是我迄今爲止所做的。

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司機。

不知道如何將語句轉換爲符合上述條件的函數。

+0

:你問了很多問題,這讓我很困惑'首先:'你需要一個函數'HIGHTRIP(LICENSENUM)',把許可證編號作爲輸入,基於此,你想要檢索'lenght','second '''''''''''''''''''''''''需要一個函數來取消所有驅動程序的長度。'Third'':你想顯示不執行任何旅程的驅動程序。現在你想要實現哪些功能,並且請將表結構與一些數據一起發佈,幫助我們 。 –

+0

@GauravSoni我編輯了這個問題。我的問題只有一個。我需要創建一個功能,這是上面。 –

+0

因此,對於最後一組編輯,爲什麼您需要一個與SQL本身相反的函數?將連接放到TRIPLEG(你沒有使用它),它會給你沒有跳閘的驅動(或者把它改成左外連接..但是現在的計數會報告跳閘腿的數量) – DazzaL

回答

0

那麼,我建議你分開你的需求,從最簡單的部分開始,建立起來,而不是試圖首先寫出整個查詢。您的查詢返回給定驅動程序的TRIPLEG表中的行數,這似乎不符合您的要求。我還建議你看看PL/SQL documentation,特別是CREATE FUNCTION syntax和一些examples

例如,我會在下面的子任務進行細分的問題:旅行的一個司機

  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 d.*, hightrip(d.lnum) 
        FROM driver d; 
    

PL/SQL呼籲沒有旅行的驅動程序時,HIGHTRIP功能會產生NO_DATA_FOUND例外。但是,這樣的異常被視爲來自SQL的NULL,因此您可以按原樣使用上述查詢。

+0

謝謝很多。我能夠清楚地瞭解和學習。在測試你的解決方案時2.我意識到rownum,但它沒有在任何地方聲明。它是什麼,它是爲了什麼? –

+0

我想知道如何區分重複。根據我的記錄原因,我有3次旅行,每次5腿。但是,泰語陳述僅給出了具有5條腿的第一次旅行。 –

+0

非常感謝。它工作很棒。但我想了解我以前發佈的查詢。它的學習。我不想盲目複製。如果你能解釋我的疑問,會不會流露出來。再來一次。非常感謝。 –

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完全以大寫形式編寫的程序會因爲它們太難閱讀而退出。