복붙노트

[SQL] 어떻게 선택에 ORA-01427 단일 행 부질의 반환을 둘 이상의 행을 해결하기 위해?

SQL

어떻게 선택에 ORA-01427 단일 행 부질의 반환을 둘 이상의 행을 해결하기 위해?

내가 다음 쿼리를 실행하면, 나는 같은 메시지를 얻을 수

SELECT E.I_EmpID AS EMPID,
       E.I_EMPCODE AS EMPCODE,
       E.I_EmpName AS EMPNAME,
       REPLACE(TO_CHAR(A.I_REQDATE, 'DD-Mon-YYYY'), ' ', '') AS FROMDATE,
       REPLACE(TO_CHAR(A.I_ENDDATE, 'DD-Mon-YYYY'), ' ', '') AS TODATE,
       TO_CHAR(NOD) AS NOD,
       DECODE(A.I_DURATION,
              'FD',
              'FullDay',
              'FN',
              'ForeNoon',
              'AN',
              'AfterNoon') AS DURATION,
       L.I_LeaveType AS LEAVETYPE,
       REPLACE(TO_CHAR((SELECT C.I_WORKDATE
                         FROM T_COMPENSATION C
                        WHERE C.I_COMPENSATEDDATE = A.I_REQDATE
                          AND C.I_EMPID = A.I_EMPID),
                       'DD-Mon-YYYY'),
               ' ',
               '') AS WORKDATE,
       A.I_REASON AS REASON,
       AP.I_REJECTREASON AS REJECTREASON
  FROM T_LEAVEAPPLY A
 INNER JOIN T_EMPLOYEE_MS E
    ON A.I_EMPID = E.I_EmpID
   AND UPPER(E.I_IsActive) = 'YES'
   AND A.I_STATUS = '1'
 INNER JOIN T_LeaveType_MS L
    ON A.I_LEAVETYPEID = L.I_LEAVETYPEID
  LEFT OUTER JOIN T_APPROVAL AP
    ON A.I_REQDATE = AP.I_REQDATE
   AND A.I_EMPID = AP.I_EMPID
   AND AP.I_APPROVALSTATUS = '1'
 WHERE E.I_EMPID <> '22'
 ORDER BY A.I_REQDATE DESC

내가 ORDER BY A.I_REQDATE DESC없이 실행할 때 100 개 행을 반환 ...

해결법

  1. ==============================

    1.다음 쿼리를 사용합니다 :

    다음 쿼리를 사용합니다 :

    SELECT E.I_EmpID AS EMPID,
           E.I_EMPCODE AS EMPCODE,
           E.I_EmpName AS EMPNAME,
           REPLACE(TO_CHAR(A.I_REQDATE, 'DD-Mon-YYYY'), ' ', '') AS FROMDATE,
           REPLACE(TO_CHAR(A.I_ENDDATE, 'DD-Mon-YYYY'), ' ', '') AS TODATE,
           TO_CHAR(NOD) AS NOD,
           DECODE(A.I_DURATION,
                  'FD',
                  'FullDay',
                  'FN',
                  'ForeNoon',
                  'AN',
                  'AfterNoon') AS DURATION,
           L.I_LeaveType AS LEAVETYPE,
           REPLACE(TO_CHAR((SELECT max(C.I_WORKDATE)
                             FROM T_COMPENSATION C
                            WHERE C.I_COMPENSATEDDATE = A.I_REQDATE
                              AND C.I_EMPID = A.I_EMPID),
                           'DD-Mon-YYYY'),
                   ' ',
                   '') AS WORKDATE,
           A.I_REASON AS REASON,
           AP.I_REJECTREASON AS REJECTREASON
      FROM T_LEAVEAPPLY A
     INNER JOIN T_EMPLOYEE_MS E
        ON A.I_EMPID = E.I_EmpID
       AND UPPER(E.I_IsActive) = 'YES'
       AND A.I_STATUS = '1'
     INNER JOIN T_LeaveType_MS L
        ON A.I_LEAVETYPEID = L.I_LEAVETYPEID
      LEFT OUTER JOIN T_APPROVAL AP
        ON A.I_REQDATE = AP.I_REQDATE
       AND A.I_EMPID = AP.I_EMPID
       AND AP.I_APPROVALSTATUS = '1'
     WHERE E.I_EMPID <> '22'
     ORDER BY A.I_REQDATE DESC
    

    트릭은 집계 함수를 (내가 사용 최대가 () 여기)를 추가하여 내부 쿼리 반환에게 하나 개의 기록을 강제하는 것입니다. 이것은 완벽하게까지 쿼리에 관한 한 작동하지만, 내부 쿼리가 데이터를 검사하여 여러 레코드를 반환하는 이유를 솔직히, 영업 이익은 조사해야합니다. 이러한 여러 레코드 관련 사업은 현명한 정말 있습니까?

  2. ==============================

    2.유일한 하위 쿼리는이 것으로 보인다 - 위치를 확인하기 위해에 ROWNUM 제한을 추가하십시오 :

    유일한 하위 쿼리는이 것으로 보인다 - 위치를 확인하기 위해에 ROWNUM 제한을 추가하십시오 :

    (SELECT C.I_WORKDATE
             FROM T_COMPENSATION C
             WHERE C.I_COMPENSATEDDATE = A.I_REQDATE AND ROWNUM <= 1
             AND C.I_EMPID = A.I_EMPID)
    

    당신이이 고유하지 왜 그러나, 조사 할 필요합니까 - 예를 들어, 직원이 일치하는 날짜에 둘 이상의 C.I_COMPENSATEDDATE 있었다 수 있습니다.

    성능상의 이유로, 당신은 또한 조회 하위 쿼리는 내부 /로 재 배열 할 수있는 경우 가입 왼쪽 볼 수, 즉,

     SELECT 
        ...
        REPLACE(TO_CHAR(C.I_WORKDATE, 'DD-Mon-YYYY'),
                ' ',
                '') AS WORKDATE,
        ...
     INNER JOIN T_EMPLOYEE_MS E
        ...
         LEFT OUTER JOIN T_COMPENSATION C
              ON C.I_COMPENSATEDDATE = A.I_REQDATE
              AND C.I_EMPID = A.I_EMPID
        ...
    
  3. ==============================

    3.

    (SELECT C.I_WORKDATE
             FROM T_COMPENSATION C
             WHERE C.I_COMPENSATEDDATE = A.I_REQDATE AND ROWNUM <= 1
             AND C.I_EMPID = A.I_EMPID)
    
  4. from https://stackoverflow.com/questions/21397694/how-to-fix-ora-01427-single-row-subquery-returns-more-than-one-row-in-select by cc-by-sa and MIT license