2016-12-30 6 views
-1

Я получаю ошибку «слишком много значений» из этого кода. Может ли кто-нибудь сказать мне, что я делаю неправильно?Ошибка: слишком много значений

SELECT (:START_DATE)|| ' TO '|| (:END_DATE) ACTIVITY_PERIOD, 
     EMP_NO, 
     DEPT, 
     EMP_NAME, 
     COUNT(*)"# OF VIOLATIONS", 
     (SELECT TO_CHAR(IN_TIME,'HH:MI AM') AS INTIME, 
     TO_CHAR(OUT_TIME,'HH:MI') AS OUTTIME 
     FROM INV.HR_ATTENDANCES A 
     WHERE TO_CHAR(IN_TIME,'HH:MI')=:IN_TIME 
     AND TO_CHAR(OUT_TIME,'HH:MI')=:OUT_TIME) 
FROM INV.EMP_ACTIVITY_HISTORY_SHIFTS   
WHERE (ATTENDANCE_DATE BETWEEN :START_DATE AND :END_DATE) 
AND (TOTAL_OUT > 4 OR MINT > (case when to_char(attendance_date,'DAY')= 'FRIDAY' then 135 else 90 end)) 
GROUP BY TO_CHAR(ATTENDANCE_DATE,'MON-RRRR'),EMP_NO,EMP_NAME,ORG_ID,DEPT,SHIFT_ID 
ORDER BY 5 DESC 
+2

Можете ли вы вставить точное сообщение об ошибке из Oracle? –

+4

Вы не можете выбрать несколько столбцов и строк в подзапросе в отдельной части. – GurV

+0

Gurwinder Singh, но где он это делает? – cybernetic87

ответ

2

Возможно, проблема заключается в том, что сегмент кода ниже.

(SELECT TO_CHAR(IN_TIME,'HH:MI AM') AS INTIME, 
    TO_CHAR(OUT_TIME,'HH:MI') AS OUTTIME 
    FROM INV.HR_ATTENDANCES A 
    WHERE TO_CHAR(IN_TIME,'HH:MI')=:IN_TIME 
    AND TO_CHAR(OUT_TIME,'HH:MI')=:OUT_TIME) 

Когда некоторый подзапрос используется как часть SELECT столбцов, выход запроса должен быть точно 1 ряд, 1 колонку таким образом, чтобы выходной сигнал запроса может рассматриваться в качестве столбца в общем результате запроса.

Пожалуйста, проверьте следующее

  • Execute выше части запроса, независимо с некоторым входом образца и убедитесь, что вы получаете ровно один ряд на выходе.
  • Чтобы создать один выход колонки, возможно, придется

Либо сцепить обе колонки (например: TO_CHAR(IN_TIME,'HH:MI AM') || 'IN '|| TO_CHAR(OUT_TIME,'HH:MI') ||' OUT' AS IN_OUTTIME)

Или

Вам нужно сделать их 2 отдельными подзапросы как часть вашего внешний запрос например: SELECT ....,(sELECT TO_CHARIN_TIME..()...FROM inv.hr_attendances..) IN_TIME, (sELECT TO_CHAR(OUT_TIME...)...FROM inv.hr_attendances..) OUTTIME from ...

в качестве альтернативы, вы можете переместить весь вспомогательный запрос для WITH пункта или JOIN его Основной запрос например:

WITH IN_OUT_TIME AS (
    (SELECT TO_CHAR(IN_TIME,'HH:MI AM') AS INTIME, 
      TO_CHAR(OUT_TIME,'HH:MI') AS OUTTIME 
      FROM INV.HR_ATTENDANCES A 
      WHERE TO_CHAR(IN_TIME,'HH:MI')=:IN_TIME 
      AND TO_CHAR(OUT_TIME,'HH:MI')=:OUT_TIME)) 
SELECT (:START_DATE)|| ' TO '|| (:END_DATE) ACTIVITY_PERIOD, 
     EMP_NO, 
     DEPT, 
     EMP_NAME, 
     COUNT(*)"# OF VIOLATIONS", 
     IN_TIME, 
     OUT_TIME 
     FROM INV.EMP_ACTIVITY_HISTORY_SHIFTS , IN_OUT_TIME 
     WHERE (ATTENDANCE_DATE BETWEEN :START_DATE AND :END_DATE) 
     AND (TOTAL_OUT > 4 
       OR 
       MINT > (case when to_char(attendance_date,'DAY')= 'FRIDAY' then 135 else 90 end))` 

Также обратите внимание на вашу группу по статье должен содержать столбцы из вашего SELECT заявления для столбцов, полученных в качестве группы функции (например: count(*)), за исключением. Пожалуйста, повторно обратитесь к своей группе по требованию.

+0

, когда я пишу 2 отдельных подзапроса как часть внешний запрос, затем следующая ошибка ORA-01427: однострочный подзапрос возвращает более одной строки – ash

+0

да, вам нужно обеспечить, чтобы подзапрос возвращал только 1 строку. Добавьте правильные условия в предложение WHERE для дополнительного запроса. если ваши данные содержат несколько строк для требуемых критериев, либо вы должны посмотреть на объединение или использование групповых функций на основе вашей потребности в обработке данных. –

+0

Я думаю, что я добавляю правильное условие в том, где статья – ash

Смежные вопросы