sql - 需要在我的查询 oracle r12 中删除重复项
问题描述
我是 Oracle 数据库的新手。我目前正在查询员工的月薪。我可以得到员工的工资。问题是查询非常慢。我相信这是因为它返回重复项。我已经找到并使用了我知道会有重复的表的数据跟踪。我似乎找不到删除最后一组重复项的方法。我想我应该使用一个我没有使用过的表(在我当前的查询中)来使用该表来删除重复项。我感谢您的帮助,并感谢您抽出宝贵的时间。
SELECT (EEV.SCREEN_ENTRY_VALUE)/12 SALARY
FROM apps.PER_JOBS_TL JBT,
apps.PER_ALL_ASSIGNMENTS_F ASF,
apps.PER_PEOPLE_F PER,
apps.PAY_PAYROLL_ACTIONS PPA,
apps.PAY_ASSIGNMENT_ACTIONS PAA,
PAY_ELEMENT_ENTRY_VALUES_F EEV,
apps.PAY_ELEMENT_ENTRIES_F EE,
apps.PER_PAY_BASES PPB
----------------------
----------------------
WHERE JBT.JOB_ID(+) = ASF.JOB_ID
and upper(PER.Employee_number) LIKE '%'
AND PER.PERSON_ID = ASF.PERSON_ID
AND PAA.PAYROLL_ACTION_ID = PPA.PAYROLL_ACTION_ID
AND PPA.ACTION_TYPE IN ('R','Q','P','U','V')
AND PAA.ASSIGNMENT_ID = ASF.ASSIGNMENT_ID
AND PPB.PAY_BASIS_ID = ASF.PAY_BASIS_ID
AND EEV.INPUT_VALUE_ID+0 = PPB.INPUT_VALUE_ID
AND PPA.DATE_EARNED BETWEEN ASF.EFFECTIVE_START_DATE AND ASF.EFFECTIVE_END_DATE
AND PPA.DATE_EARNED BETWEEN PER.EFFECTIVE_START_DATE AND PER.EFFECTIVE_END_DATE
AND PPA.DATE_EARNED BETWEEN EEV.EFFECTIVE_START_DATE AND EEV.EFFECTIVE_END_DATE
AND PPA.DATE_EARNED BETWEEN EE.EFFECTIVE_START_DATE AND EE.EFFECTIVE_END_DATE
AND EE.ASSIGNMENT_ID = ASF.ASSIGNMENT_ID
AND EE.ELEMENT_ENTRY_ID = EEV.ELEMENT_ENTRY_ID
AND ASF.CREATION_DATE BETWEEN ASF.EFFECTIVE_START_DATE AND ASF.EFFECTIVE_END_DATE
AND PPA.EFFECTIVE_DATE BETWEEN '01-dec-2019' AND '31-dec-2019'
解决方案
通过使用现代连接语法的查询,它看起来像 -
SELECT (EEV.SCREEN_ENTRY_VALUE)/12 SALARY
FROM apps.PER_JOBS_TL JBT
LEFT JOIN apps.PER_ALL_ASSIGNMENTS_F ASF ON JBT.JOB_ID = ASF.JOB_ID
JOIN apps.PER_PEOPLE_F PER ON PER.PERSON_ID = ASF.PERSON_ID
JOIN apps.PAY_ASSIGNMENT_ACTIONS PAA ON PAA.ASSIGNMENT_ID = ASF.ASSIGNMENT_ID
JOIN apps.PAY_PAYROLL_ACTIONS PPA ON PAA.PAYROLL_ACTION_ID = PPA.PAYROLL_ACTION_ID
AND PPA.DATE_EARNED BETWEEN ASF.EFFECTIVE_START_DATE AND ASF.EFFECTIVE_END_DATE
AND PPA.DATE_EARNED BETWEEN PER.EFFECTIVE_START_DATE AND PER.EFFECTIVE_END_DATE
JOIN apps.PER_PAY_BASES PPB ON PPB.PAY_BASIS_ID = ASF.PAY_BASIS_ID
JOIN PAY_ELEMENT_ENTRY_VALUES_F EEV ON EEV.INPUT_VALUE_ID+0 = PPB.INPUT_VALUE_ID
AND PPA.DATE_EARNED BETWEEN EEV.EFFECTIVE_START_DATE AND EEV.EFFECTIVE_END_DATE
JOIN apps.PAY_ELEMENT_ENTRIES_F EE ON EE.ASSIGNMENT_ID = ASF.ASSIGNMENT_ID
AND EE.ELEMENT_ENTRY_ID = EEV.ELEMENT_ENTRY_ID
AND PPA.DATE_EARNED BETWEEN EE.EFFECTIVE_START_DATE AND EE.EFFECTIVE_END_DATE
WHERE UPPER(PER.Employee_number) LIKE '%'
AND PPA.ACTION_TYPE IN ('R','Q','P','U','V')
AND ASF.CREATION_DATE BETWEEN ASF.EFFECTIVE_START_DATE AND ASF.EFFECTIVE_END_DATE
AND PPA.EFFECTIVE_DATE BETWEEN '01-dec-2019' AND '31-dec-2019'
我刚刚意识到您可能缺少表的连接条件apps.PAY_ASSIGNMENT_ACTIONS
。这可能是结果重复的主要问题。如果您对此表没有其他连接条件,那一切都很好。
为了加快您的查询速度,您可以在您的表上尝试以下索引 -
apps.PER_JOBS_TL (JOB_ID) -- Not required if it is primary key
apps.PER_ALL_ASSIGNMENTS_F (JOB_ID, PERSON_ID, EFFECTIVE_START_DATE, EFFECTIVE_END_DATE ) -- Not required on primary key columns
apps.PER_PEOPLE_F (PERSON_ID, EFFECTIVE_START_DATE, EFFECTIVE_END_DATE) -- Not required on primary key columns
apps.PAY_ASSIGNMENT_ACTIONS(ASSIGNMENT_ID) -- Not required if it is primary key
apps.PAY_PAYROLL_ACTIONS(ACTION_TYPE, EFFECTIVE_DATE, DATE_EARNED) -- Not required on primary key columns
apps.PER_PAY_BASES(PAY_BASIS_ID, INPUT_VALUE_ID) -- Not required on primary key columns
PAY_ELEMENT_ENTRY_VALUES_F(INPUT_VALUE_ID, ELEMENT_ENTRY_ID, EFFECTIVE_START_DATE, EFFECTIVE_END_DATE) -- Not required on primary key columns
apps.PAY_ELEMENT_ENTRIES_F(ASSIGNMENT_ID,ELEMENT_ENTRY_ID, EFFECTIVE_START_DATE,EFFECTIVE_END_DATE) -- Not required on primary key columns
推荐阅读
- javascript - 如何在具有最多出现值的对象的数组中查找值(深度模式)?
- vb.net - 添加使用其他版本的 Visual Studio 编译的参考
- javascript - Nashorn 挂在螺纹内
- laravel - laravel API 资源。删除请求会话已过期。仅获取方法工作
- python - 我可以直接在列表或矩阵上应用 exp 函数吗?
- javascript - XMLHttpRequest 在 WordPress 中不起作用
- sql - SQL SERVER 按月分组日期时间戳
- arguments - 将参数传递给 Colab .ipynb 脚本
- django - 如何在 Django Admin 中显示数据
- kubernetes - 如何在 kubernetes 仪表板中将基本身份验证模式设置为基于令牌?