2012-02-23 9 views
-2

私持っている機能のリターン従業員番号の整数のMySQL関数型キャストエラー

CREATE FUNCTION `getUser`(s CHAR(20)) RETURNS char(50) CHARSET latin1 
RETURN @user; 

私は(0.00秒)

が、その本

select e.emp_number from hs_hr_employee e where 

hie_code_1 in (select hie_code_1 from hs_hr_emp_level L,hs_hr_users U where L.emp_number=U.emp_number and L.emp_number=getUser2() and (U.def_level=1 or U.def_level=4) ) 
or 
hie_code_3 in (select hie_code_3 from hs_hr_emp_level L,hs_hr_users U where L.emp_number=U.emp_number and L.emp_number=getUser2() and U.def_level=2 ) 
or 
    hie_code_4 in (select hie_code_4 from hs_hr_emp_level L,hs_hr_users U where L.emp_number=U.emp_number and L.emp_number=getUser2() and U.def_level=3) 

がより遅くなる実行して、その戻りを実行するとき;

が、私はハード

select e.emp_number from hs_hr_employee e where 

hie_code_1 in (select hie_code_1 from hs_hr_emp_level L,hs_hr_users U where L.emp_number=U.emp_number and L.emp_number=5 and (U.def_level=1 or U.def_level=4) ) 
or 
hie_code_3 in (select hie_code_3 from hs_hr_emp_level L,hs_hr_users U where L.emp_number=U.emp_number and L.emp_number=5 and U.def_level=2 ) 
or 
    hie_code_4 in (select hie_code_4 from hs_hr_emp_level L,hs_hr_users U where L.emp_number=U.emp_number and L.emp_number=5 and U.def_level=3) 

にコード化されたときに、これは(0.00秒)の時間でで返されます。 optimiste機能のソリューションを提供してください。

+1

'getUser2()'とは何ですか? –

+0

あなたのクエリでgetuser2()を呼び出すが、getUserのためのdefnitionを表示する? @user varには何が返されていますか? –

+0

emp_number列とdef_level列に索引が設定されていますか? –

答えて

1

あなたのサンプルは私の目を傷つけるを作るが、

  1. hs_hr_employee.emp_number == hs_hr_emp_level.emp_number == hs_hr_emp_level.emp_number
  2. hs_hr_employee.hie_code_*n* == hs_hr_users.hie_code_ を次のように、ここで

    SELECT DISTINCT e.emp_number 
    
    FROM hs_hr_employee e 
    
    INNER JOIN hs_hr_emp_level L 
    ON L.emp_number = e.emp_number 
    AND (
        e.hie_code_1 = U.hie_code_1 
        OR e.hie_code_3 = U.hie_code_3 
        OR e.hie_code_4 = U.hie_code_4 
    ) 
    
    INNER JOIN hs_hr_users U 
    ON U.emp_number = e.emp_number 
    AND U.def_level IN (1,2,3,4) 
    
    -- You stated getUser2() returns paramter @user, so just accessing directly 
    WHERE e.emp_number = @user 
    

    想定可能な代替の試みですn

  3. getUser2()は、従業員番号である@userを返します。

構文上、複雑なクエリは何をしていますか。上記のように誤っているとアドバイスするのは難しいですが、それでも完全なテーブル構造/適切な詳細を提供しないと、それ以上は助けません。