2012-02-23 66 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秒)的時間。 請給出優化功能的解決方案;

+1

'getUser2()'做了什麼? – 2012-02-23 14:31:48

+0

您在查詢中調用getuser2(),但顯示getUser的定義?它返回的@user var是什麼? – 2012-02-23 14:32:20

+0

你有在emp_number和def_level列設置的索引嗎? – 2012-02-23 14:35:17

回答

1

你的樣品讓我的眼睛受傷了,但這裏的一個可能的替代

試圖
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 

假設如下

  1. hs_hr_employee.emp_number == == hs_hr_emp_level.emp_numberhs_hr_emp_level.emp_number
  2. hs_hr_employee.hie_code_*n* == hs_hr_users.hie_code_ n
  3. getUser2()返回@user,這是一個員工號碼

從上面的語句中可以看出,您的複雜查詢在做什麼。很難指出,因爲上述感覺不正確 - 如果你不提供一個完整的表格結構/適當的細節,雖然然後我不禁進一步。