我有一個程序,爲員工分配「首選車輛」,並最終確保沒有員工擁有相同的車輛。提高SQL Developer中的存儲過程的性能 - 嵌套循環
第一個循環獲取不止一次出現的所有首選車輛的列表,並且嵌套循環遍歷每個擁有該車輛的員工。最後,只有一個員工都會有它設置爲他/她的首選車輛
--Loop through to see if a pref_veh occurs more than once
FOR every_duplicate_veh IN
(SELECT PREFERRED_VEH FROM FLEET_USER GROUP BY PREFERRED_VEH HAVING COUNT (PREFERRED_VEH) > 1)
LOOP
max_count:=0;
--Loop through all the employees with the duplicate vehicle
FOR every_employee IN (SELECT EMPLOYEE_ID FROM FLEET_USER WHERE PREFERRED_VEH=every_duplicate_veh.PREFERRED_VEH)
LOOP
--Find which employee is assigned the vehicle the most
SELECT COUNT(ASSIGN_VEH_ID) INTO assigned_veh_count FROM FLEET_TRANSACTION
WHERE ASSIGN_VEH_ID=every_duplicate_veh.PREFERRED_VEH AND DRIVER_EMP_ID=every_employee.EMPLOYEE_ID
AND SYSDATE - 30 <= RESERV_START_DT;
IF assigned_veh_count>max_count THEN
max_count:=assigned_veh_count;
preferred_employee_id:=every_employee.EMPLOYEE_ID;
END IF;
--Reset the employee's preferred vehicle to NULL
UPDATE FLEET_USER SET PREFERRED_VEH = NULL WHERE EMPLOYEE_ID = every_employee.EMPLOYEE_ID;
INSERT INTO FLEET_PREF_VEH_LOG VALUES (SYSDATE, every_employee.EMPLOYEE_ID, NULL);
END LOOP;
--One employee will get the preferred vehicle
UPDATE FLEET_USER SET PREFERRED_VEH = every_duplicate_veh.PREFERRED_VEH WHERE EMPLOYEE_ID = preferred_employee_id;
INSERT INTO FLEET_PREF_VEH_LOG VALUES (SYSDATE, preferred_employee_id, every_duplicate_veh.PREFERRED_VEH);
COMMIT;
END LOOP;
FLEET_USER是一個表,幾千行的......我的目標是消除嵌套循環...我能做到這一點?我仍然很新的SQL,所以我會很感激任何建議/指出我已經錯過的任何東西
將數值正確設置爲開始而不重複,而不是稍後嘗試清理會更好嗎?在本節中,您可以在此刻多次更新同一行,我認爲這是一個旁白;你將所有匹配的行都清空,然後把它放回原來的樣子。看起來你希望在過去的30天內將首選車輛設置爲最常用的車輛,並且如果你是該車輛的第二高用戶,那麼最終沒有偏好,對吧? – 2015-01-26 19:39:58
可能想看看這個網站:http://codereview.stackexchange.com/。你可能會有更好的運氣。 – macoms01 2015-01-26 19:46:29