Использование dbms_random.value и сортировка по дате ... Oracle SQL - PullRequest
0 голосов
/ 18 января 2012

У меня есть следующий запрос, который написан в Oracle OCL:

 SELECT  
 "P No","Name","Type","AID","Start","End","Day Ended","Worker","Team","Outcome"
 FROM
(SELECT
 O_ASSESSMENTS.ASM_SUBJECT_ID as "P No",
olm_bo.get_name(O_ASSESSMENTS.ASM_SUBJECT_ID,O_ASSESSMENTS.ASM_SUBJECT_IND) as "Name",
O_QUESTION_SET_APPLICATIONS.QSA_DESC as "Type",
O_ASSESSMENTS.ASM_ID as "AID",
O_ASSESSMENTS.ASM_START_DATE as "Start",
O_ASSESSMENTS.ASM_END_DATE as "End",
TO_CHAR(O_ASSESSMENTS.ASM_END_DATE, 'Day') as "Day Ended",
olm_bo.get_org_name(assessment_worker.RES_PARTY_OUN_ID) as "Worker",
olm_bo.get_per_name(assessment_worker.RES_PARTY_ID) as "Team",
olm_bo.get_ref_desc(O_ASSESSMENTS.ASM_OUTCOME,'ASM_OUTCOME') as "Outcome"
FROM
 O_QUESTION_SET_APPLICATIONS,
 O_RESPONSIBILITIES  assessment_worker,
 O_ASSESSMENTS
 WHERE
( assessment_worker.RES_REC_ID(+)=O_ASSESSMENTS.ASM_ID AND assessment_worker.RES_REC_TYPE (+)='ASM' AND assessment_worker.RES_END_DATE IS NULL  )
 AND  ( O_QUESTION_SET_APPLICATIONS.QSA_ID=O_ASSESSMENTS.ASM_QSA_ID  )
 AND  
 (olm_bo.get_org_name(assessment_worker.RES_PARTY_OUN_ID)  =  'TEAM'
  AND
  olm_bo.get_ref_desc(O_ASSESSMENTS.ASM_OUTCOME,'ASM_OUTCOME')  IN  ('No Further Action')
  AND
  O_ASSESSMENTS.ASM_END_DATE  Is Not Null  
  AND
  O_QUESTION_SET_APPLICATIONS.QSA_ID  IN  ( 'TYPE1'  )
  AND
  O_ASSESSMENTS.ASM_END_DATE  >=   trunc(sysdate-7)
)
 ORDER BY
  dbms_random.value)
 WHERE  ROWNUM  <=  30
 ORDER BY "End" DESC

В основном он возвращает закрытые оценки, которые были закрыты на прошлой неделе, а dbms_random.value возвращает 30 случайных записей. Тем не менее, я также хотел бы отсортировать окончательный вывод в порядке убывания по дате окончания. Однако, похоже, это не работает вообще, и я думаю, это как-то связано с dbms_random.value. Я попытался поместить порядок на «конец» выше dms_random.value, но, похоже, это тоже не сработало - оба примера кода будут работать, но они не возвращаются ни в каком порядке по дате. Не уверен, что я что-то ослепительно упускаю, но любые идеи будут высоко оценены.

Спасибо.

Edit:

Странно, это работает:

SELECT  *  FROM
(SELECT
  O_ASSESSMENTS.ASM_SUBJECT_ID as "P_No",
  olm_bo.get_name(O_ASSESSMENTS.ASM_SUBJECT_ID,O_ASSESSMENTS.ASM_SUBJECT_IND) as "Name",
  O_QUESTION_SET_APPLICATIONS.QSA_DESC as "Type",
  O_ASSESSMENTS.ASM_ID as "AID",
  O_ASSESSMENTS.ASM_START_DATE as "Start",
  O_ASSESSMENTS.ASM_END_DATE as "End",
 TO_CHAR(O_ASSESSMENTS.ASM_END_DATE, 'Day') as "Day_Ended",
  olm_bo.get_org_name(assessment_worker.RES_PARTY_OUN_ID) as "Team",
  olm_bo.get_per_name(assessment_worker.RES_PARTY_ID) as "Worker",
  olm_bo.get_ref_desc(O_ASSESSMENTS.ASM_OUTCOME,'ASM_OUTCOME') as "Outcome"
FROM
  O_QUESTION_SET_APPLICATIONS,
  O_RESPONSIBILITIES  assessment_worker,
  O_ASSESSMENTS
WHERE
  ( assessment_worker.RES_REC_ID(+)=O_ASSESSMENTS.ASM_ID AND assessment_worker.RES_REC_TYPE(+)='ASM' AND assessment_worker.RES_END_DATE IS NULL  )
  AND  ( O_QUESTION_SET_APPLICATIONS.QSA_ID=O_ASSESSMENTS.ASM_QSA_ID  )
  AND  
  (nvl(olm_bo.get_org_name(assessment_worker.RES_PARTY_OUN_ID),'NULL')  =  'TEAM'
   AND
   nvl(olm_bo.get_ref_desc(O_ASSESSMENTS.ASM_OUTCOME,'ASM_OUTCOME'),'NULL')  IN  ( 'CONTACT ONLY - all actions complete','No Further Action'  )
   AND
   O_ASSESSMENTS.ASM_END_DATE  Is Not Null  
   AND
   nvl(O_QUESTION_SET_APPLICATIONS.QSA_ID,'NULL')  IN  ( 'TYPE1')
   AND
   O_ASSESSMENTS.ASM_END_DATE  >=   trunc(sysdate-7)
  )
ORDER BY
   dbms_random.value)
WHERE  ROWNUM  <=  30
ORDER BY "End" DESC

Так что не знаю, был ли сбой в исходном коде, или что-то было изменено, чтобы заставить его работать ...

1 Ответ

2 голосов
/ 18 января 2012

Хороший пример работает хорошо, поэтому, проверяя ваш SQL явно, в посте, похоже, есть проблема из-за внесенных вами правок. Я сделал отступ, чтобы сделать его более понятным.

SELECT *
FROM 
    (
    SELECT 
        "P No","Name","Type","AID","Start"
        ,"End","Day Ended","Worker","Team","Outcome" 
    FROM O_ASSESSMENTS 
    WHERE 
     O_ASSESSMENTS.ASM_END_DATE  Is Not Null   
    AND 
      nvl(O_QUESTION_SET_APPLICATIONS.QSA_ID,'NULL')  IN  ( 'TYPE1') 
    AND 
     O_ASSESSMENTS.ASM_END_DATE  >=   trunc(sysdate-7) 
   ) 
ORDER BY 
dbms_random.value

) 
WHERE  ROWNUM  <=  30 
ORDER BY "End" DESC 

Эта заключительная закрывающая скобка ничего не соответствует, поэтому что-то не совсем верно. Пример, который я бросил вместе:

select a.test_id
from
(
select test_id
from tbl_Test
order by dbms_random.value
) a
where rownum <= 10
order by a.test_id

Возвращает 10 случайных идентификаторов из таблицы примера в порядке, указанном во внешнем порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...