2016-10-11 2 views

Antwort

2

Sie verwenden eine Nicht-Standard-Oracle-Funktion. Daten in Unterabfragen haben ursprünglich keine Reihenfolge, aber in Oracle können Sie sie bestellen, um später die ROWNUM-Kriterien anwenden zu können. ROWNUM ist auch Oracle-spezifisch.

Darüber hinaus kann es mehrere Mitarbeiter mit dem gleichen Gehalt geben, wo Sie eine von ihnen willkürlich auswählen, anstatt sie alle zu zeigen.

Hier ist, wie die Mitarbeiter auszuwählen (n) mit dem Gehalt der Nähe des avarage in Standard-SQL:

select * 
from emp 
order by abs(sal - avg(sal) over()) 
fetch first row with ties; 

Diese letzte Zeile nur von Oracle 12c zur Verfügung steht.

Bei älteren Versionen (dh Oracle 9i, 10i oder 11g) Sie Ihre Zeilen stattdessen Rang würden:

select empno, ename, sal 
from 
(
    select empno, ename, sal, rank() over (order by diff) as rnk 
    from 
    (
    select emp.*, abs(sal - avg(sal) over()) as diff 
    from emp 
) evaluated 
) ranked 
where rnk = 1; 
+1

Hallo, mit meiner 12c Datenbank, Ihre Reihe Klausel Begrenzung einen Fehler wirft. Wenn ich die Klausel in "FIRST REIW ROW WITH TIES" ändere, funktioniert es. –

+0

@ Patrick Bacon: Danke. Du hast natürlich Recht. –

2
with av as (select avg(sal) avgsal from scott.emp) 
select emp.*, abs(emp.sal-av.avgsal) dist 
    from scott.emp, av 
    order by dist; 

Oben sieht besser für mich aus, aber wahrscheinlich können Sie es am besten mit analytischen Funktion erhalten. Etwas wie:

select * from (
    select emp.*, abs(avg(emp.sal) over() - sal) diff 
    from scott.emp order by diff) 
where rownum = 1; 
2

Mitarbeiter Pulling Daten wieder mit der Unterabfrage:

select empno, sal, SalDif 
from 
    (
    select empno, sal, abs(sal - (select avg(sal) from emp)) as SalDif 
    from emp 
    order by SalDif 
) 
where rownum = 1; 

oder als CTE:

with CTE as 
    (
    select empno, sal, abs(sal - (select avg(sal) from emp)) as SalDif 
    from emp 
    order by SalDif 
) 
select empno, sal, SalDif 
from CTE 
where rownum = 1; 
Verwandte Themen