2017-06-15 14 views
0
DELIMITER $ 
CREATE FUNCTION MAXSCOREID(START_STUDENT_ID INT, END_STUDENT_ID INT) 
RETURNS INT 
BEGIN 
DECLARE STUDENT_ID INT; 
BEGIN 
    SELECT MAX(SCORE) INTO STUDENT_ID 
    FROM STUDENT ST, SCORE S 
    WHERE ST.STUDENT_ID = S.STUDENT_ID 
    AND ST.STUDENT_ID BETWEEN 1 AND 10; 
END; 
RETURN student_id; 
END$ 
DELIMITER ; 

こんにちは。上記の関数では、私は高い得点を得るが、最大得点を持つ学生のIDを取得したい。助けてください。sql、function in sql

+0

また、入力パラメータを使用せず、変数に一貫性のない大文字と小文字を使用しています。 – miken32

+0

あなたはそれがうまくいくことが確信できます。ありがとうございました。 –

答えて

0

次にあなたの関数の本体を置き換えることができます。

SELECT ST.STUDENT_ID INTO student_id 
FROM STUDENT ST 
LEFT JOIN SCORE S USING (STUDENT_ID) 
WHERE ST.STUDENT_ID BETWEEN 1 AND 10 
HAVING MAX(SCORE); 

これはMAX()機能の集約形式を使用しています。変数名と列名を区別するために関数を再加工することをお勧めします。また、小文字の列名を使用してコードを読みやすくすることをお勧めします。

1

このクエリは、最大スコアを持つ生徒の集合を生成します。

select student_id 
from score 
where score = (select max(score) from score); 
+0

それ自体は機能しますが、関数に入れるとnullを返します。 –

+0

あなたの関数は単一のint(つまり1人の学生)を返すように宣言されていますが、最大得点を持つ複数の学生がいるかもしれません。複数の生徒に最大スコアを持たせる可能性に合わせて、生徒の集合を返すか、またはプロセスを変更する機能を変更する必要があります。 –