[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.다음 쿼리를 사용합니다 :
다음 쿼리를 사용합니다 :
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.유일한 하위 쿼리는이 것으로 보인다 - 위치를 확인하기 위해에 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.
(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)
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
'SQL' 카테고리의 다른 글
[SQL] SELECT COUNT (*); (0) | 2020.07.16 |
---|---|
[SQL] 쉼표로 SQL 쿼리 여러 테이블, 여러 조인과 및 열 필드로 구분 된 목록 (0) | 2020.07.16 |
[SQL] 왜 예외는 "데이터 매핑 오류의 [SQL0802] 데이터 변환을"는 무엇입니까? (0) | 2020.07.16 |
[SQL] 제외 조항에 대한 액세스 대체 (0) | 2020.07.16 |
[SQL] 오라클 SQL listagg 기능 (0) | 2020.07.16 |