Agregar consulta de combinación sin afectar a otras conexiones consulta
Vea figura:
En este caso vamos a utilizar en general, las conexiones izquierda.
select e.ENAME,d.LOC,eb.RECEIVED
from emp e join dept d
on(e.DEPTNO=d.DEPTNO) left join emp_bonus eb
on(eb.EMPNO=e.EMPNO)
order by 2
Por encima de esto se puede lograr, pero no nos ayuda a escribir la reutilización de código en un comunicado.
A continuación se muestra una consulta escalar mi camino, que puede ayudarnos a volver a utilizar parte de SQL.
select e.ENAME,d.LOC,(select eb.RECEIVED from emp_bonus eb where e.EMPNO=eb.EMPNO) as RECEIVED
from emp e join dept d
on(e.DEPTNO=d.DEPTNO)
order by 2
Aquí el principio es muy simple, de hecho, el primer conjunto recibido fila y luego ir a la consulta.
No es la misma restricción recibidas obtener debe ser sólo un resultado, debido a que un espacio se abre.
En el siguiente capítulo 600 se introducirá para el problema de si una consulta de varias líneas.
Combinación de conexión función de consulta polimerización
select e.DEPTNO,e.EMPNO,e.ENAME,e.SAL,e.SAL*case
when eb.TYPE=1 then 0.1
when eb.TYPE=2 then 0.2
when eb.TYPE=3 then 0.3
end as bonus
from EMP e,emp_bonus eb
where e.EMPNO=eb.EMPNO
and e.DEPTNO=10
Ahora sólo hay que ver la tabla en el mapa.
Hay una necesidad ahora es al principio del departamento de estadísticas para la SAL y el bono 10 de.
Esta vez, por lo general piensa en funciones de agregado.
select x.DEPTNO,sum(x.SAL) as total_sum,sum(x.bonus) as total_bonus from
(select e.DEPTNO,e.EMPNO,e.ENAME,e.SAL,e.SAL*case
when eb.TYPE=1 then 0.1
when eb.TYPE=2 then 0.2
when eb.TYPE=3 then 0.3
end as bonus
from EMP e,emp_bonus eb
where e.EMPNO=eb.EMPNO
and e.DEPTNO=10) x
group by x.DEPTNO
El resultado fue malo. Debido a que algunas personas se ven recompensados en dos ocasiones:
Así que es posible escribir:
(select e.DEPTNO,e.EMPNO,e.ENAME,e.SAL,e.SAL*case
when eb.TYPE=1 then 0.1
when eb.TYPE=2 then 0.2
when eb.TYPE=3 then 0.3
end as bonus
from EMP e,emp_bonus eb
where e.EMPNO=eb.EMPNO
and e.DEPTNO=10) x
group by x.DEPTNO
Excluir los mismos artículos incrementado Sal, Sal misma pero en caso de que alguien cómo hacerlo? Esto es definitivamente un problema. Otro problema es que si este sector si algunas personas no recibir un bono de cómo hacerlo? Esa parte no se presentó SAL
select x.DEPTNO, d.total_sum,sum(x.bonus) as total_bonus from
(select e.DEPTNO,e.EMPNO,e.ENAME,e.SAL,e.SAL*case
when eb.TYPE=1 then 0.1
when eb.TYPE=2 then 0.2
when eb.TYPE=3 then 0.3
end as bonus
from EMP e,emp_bonus eb
where e.EMPNO=eb.EMPNO
and e.DEPTNO=10
) x,(select DEPTNO,sum(EMP.SAL) as total_sum from EMP where EMP.DEPTNO=10 group by EMP.DEPTNO) d
where d.DEPTNO=x.DEPTNO
group by x.DEPTNO,d.total_sum
Podemos revisar la suma (x.bonus), y luego conectar la aparición de un d.total_sum.
Optimización sobre:
select e.DEPTNO,d.total_sum,sum(e.SAL*case
when eb.TYPE=1 then 0.1
when eb.TYPE=2 then 0.2
when eb.TYPE=3 then 0.3
end) as bonus
from EMP e,emp_bonus eb,(select DEPTNO,sum(EMP.SAL) as total_sum from EMP where DEPTNO=10 group by DEPTNO) d
where e.EMPNO=eb.EMPNO and e.DEPTNO=d.DEPTNO
group by e.DEPTNO,d.total_sum
La optimización se basa en:
hay dos condiciones se pueden combinar EMP.DEPTNO = 10, el segundo punto hay necesidad de comprobar e.ENAME estos se puede incorporar directamente.
Algunas personas pueden utilizar la suma sobre la función de escritura:
select e.DEPTNO,sum(distinct e.SAL) over (partition by e.deptno) as total_sum,sum(e.SAL*case
when eb.TYPE=1 then 0.1
when eb.TYPE=2 then 0.2
when eb.TYPE=3 then 0.3
end) over (partition by e.deptno) as bonus
from EMP e left join emp_bonus eb on e.EMPNO=eb.EMPNO
where e.DEPTNO=10
Solía unen a los anteriores externa, es para evitar el sector si algunas personas no reciben bonificación.
Hay dos problemas, uno es sobre declaración no puede incluir distintos, y la segunda es las diferentes personas en la misma empno pueden Sal.
Así que trate de no usar esta situación de esta manera.