Нужно удалить дубликаты в моем запросе oracle r12 - PullRequest
0 голосов
/ 02 апреля 2020

Я новичок в 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'

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

А) После поиска выкинул oracle документы. Ответ был в таблице pay_payroll_actions. Проблемы: так как oracle записывает каждое изменение зарплаты в таблицу pay_payroll_actions. Таким образом, если Mr.x получил повышение в сентябре, то в pay_payroll_actions будет строка для Mr.x, указывающая повышение, и строка для Mr.x, указывающая, что его зарплата выплачена.

Mrx salary row1 повышение row2

Поэтому при использовании даты вступит в силу обе строки для диапазона дат. Сопоставьте его с датой создания, после чего он получит информацию для этого указанного c месяца.

B) У PAY_ASSIGNMENT_ACTIONS есть имя столбца RUN_TYPE_ID, которое запускает фиктивный прогон для проверки работы всех систем. Фиктивный прогон не имеет места для номера организации в строке RUN_TYPE_ID, но фактический прогон, который выполняется hr или fiance, будет иметь номер организации.

Изменения размещаются следующим образом:

изменения

SELECT  (EEV.SCREEN_ENTRY_VALUE)/12 SALARY
FROM 
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 PER.PERSON_ID = ASF.PERSON_ID
AND 1=1
AND PAA.PAYROLL_ACTION_ID = PPA.PAYROLL_ACTION_ID 
AND PPA.ACTION_TYPE IN ('R','Q','P','U','V')
-------------------------------
AND PAA.RUN_TYPE_ID IS NOT NULL
-------------------------------
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'
--------------------------------------------------------------
AND PPA.CREATION_DATE  BETWEEN '01-DEC-2019' AND '31-DEC-2019'
--------------------------------------------------------------
0 голосов
/ 03 апреля 2020

Используя ваш запрос с современным синтаксисом соединения, он выглядит примерно так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...