#sql #oracle #distinct
#sql #Oracle #разные
Вопрос:
Я пытаюсь выполнить запрос в Oracle, где я хочу выполнить отдельный выбор для 2 столбцов ( position
, at.task_number
), но в целом я все еще хочу отобразить дополнительные 4 столбца.
Я понимаю, что Oracle просто использует distinct для всех используемых столбцов, а не только для предложения order в любом случае. Если я удалю уточнения APP_GRP
и ag.app_group_cd
, то мой запрос выдаст мне желаемый результат, но мне также нужно отобразить эти столбцы.
Вот как выглядит мой select сегодня, но он не дает мне того, что я хочу.
select distinct
(select cv.display from code_value cv where cv.code_value = ag.position_cd) AS POSITION, AG.POSITION_CD,
(select cv.display from code_value cv where cv.code_value = ag.app_group_cd) AS APP_GRP, ag.app_group_cd,
at.task_number, at.description, Users=count(ag.position_cd)
from
application_group ag, application_task at, task_access ta, code_value cv
plan cv
where cv.code_set= 78
and cv.active_ind = 1
and cv.begin_effective_dt_tm <= SYSDATE
and cv.end_effective_dt_tm >= SYSDATE
join ag
where ag.position_cd = cv.code_value
join ta
where ta.app_group_cd = ag.app_group_cd
join at
where at.task_number = ta.task_number
and at.task_number in (1, 2, 3, 4, 5, 6)
and at.active_ind = 1
join d
group by
ag.position_cd, ag.app_group_cd, at.task_number, at.description
having
COUNT(ag.position_cd)>0
order by position, at.task_number
ОБНОВЛЕНО
Мой запрос возвращает что-то вроде этого…
ПОЗИЦИЯ——APP_GRP——НОМЕР ЗАДАЧИ
zzzDBA————- Администратор базы данных———————1
zzzDBA————- Администратор базы данных———————4
zzzDBA————- Администратор базы данных———————3
zzzDBA————- Администратор базы данных———————5
zzzDBA————- Администратор базы данных———————2
zzzDBA————- Администратор базы данных——————— 3
zzzDBA————- Администратор базы данных——————— 4
zzzDBA————- Администратор базы данных——————— 5
В конечном счете я хочу добраться туда, куда я только возвращаюсь:
ПОЗИЦИЯ——APP_GRP——НОМЕР ЗАДАЧИ
zzzDBA————- Администратор базы данных———————1
zzzDBA————- Администратор базы данных———————4
zzzDBA————- Администратор базы данных———————3
zzzDBA————- Администратор базы данных———————5
zzzDBA————- Администратор базы данных———————2
«удаление» строк dup для TASK_NUMBER В (3, 4, 5)
Ответ №1:
Если вы не получаете различных значений для этих двух полей, то это означает, что в полях APP_GRP
и ag.app_group_cd
возвращается несколько значений.
Если вы примените что-то вроде MAX() к этим полям и удалите ag.app_group_cd
из своего оператора GROUP BY, вы, вероятно, получите разные значения, но вы, по сути, скрываете тот факт, что комбинация дает несколько значений для APP_GRP
и ag.app_group_cd
.
Если это не имеет смысла, было бы проще просмотреть примеры результатов запроса для того, что вы ожидаете увидеть, и что возвращает ваш запрос.
Комментарии:
1. Я добавил комментарий к исходному сообщению, чтобы помочь сохранить часть форматирования
2. Однако это не относится к вашему вопросу — в этом примере данных показаны только два разных поля. Это выбранные дополнительные поля, которые вызывают дублирование, нет?
Ответ №2:
Этот запрос, казалось, сделал свое дело…
SELECT tn.Position,
tn.Task_Number,
tn.TotalPosCd,
maxapp.MaxAppGroupCD,
ta.Description,
appgrp.display AS APP_GRP
FROM
(SELECT cv.display AS Position,
at.Task_Number,
COUNT(ag.position_code) AS TotalPosCd
FROM APPLICATION_TASK AT ,
TASK_ACCESS TA ,
APPLICATION_GROUP AG ,
CODE_VALUE CV
WHERE AG.POSITION_CD = CV.CODE_VALUE
AND TA.APP_GROUP_CD = AG.APP_GROUP_CD
AND AT.TASK_NUMBER = TA.TASK_NUMBER
AND CV.CODE_SET = 88
AND CV.ACTIVE_IND = 1
AND CV.BEGIN_EFFECTIVE_DT_TM <= SYSDATE
AND CV.END_EFFECTIVE_DT_TM >= SYSDATE
AND AT.TASK_NUMBER IN (1,2,3,4,5,6)
AND AT.ACTIVE_IND = 1
GROUP BY cv.display,
at.Task_Number
HAVING COUNT(ag.Position_code) > 0
) tn,
(SELECT ta.Task_Number,
MAX(ag.App_Group_CD) AS MaxAppGroupCD
FROM TASK_ACCESS ta,
APPLICATION_TASK at,
APPLICATION_GROUP ag
WHERE tn.Task_number = ta.Task_number
AND ta.Task_Number = at.Task_number
AND ta.App_Group_CD = ag.App_Group_CD
GROUP BY ta.Task_number
) maxapp,
TASK_ACCESS ta,
CODE_VALUE appgrp
WHERE tn.Task_number = maxapp.Task_Number
AND maxapp.MaxAppGroupCD = ta.app_group_cd
AND tn.Task_Number = ta.Task_Number
AND maxapp.MaxAppGroupCD = appgrp.Code_Value