sql >> Databáze >  >> RDS >> Oracle

Jak opravit jednořádkový poddotaz Ora-01427 vrací více než jeden řádek ve výběru?

Použijte následující dotaz:

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

Trik je vynutit, aby vnitřní dotaz vrátil pouze jeden záznam přidáním agregační funkce (zde jsem použil max()). To bude fungovat perfektně, pokud jde o dotaz, ale upřímně řečeno, OP by měl prozkoumat, proč vnitřní dotaz vrací více záznamů, tím, že prozkoumá data. Jsou tyto četné záznamy skutečně relevantní z obchodního hlediska?



  1. Použití DMV ( Dynamic Management View ) a DMF ( Dynamic Management Function ) | Řešení problémů s výkonem serveru SQL -4

  2. pg drahokam '0.14.0' na Mountain Lion selže

  3. 3 způsoby, jak zpřístupnit kolace v MariaDB

  4. jak zkontrolovat všechna omezení na stole v oracle