Saturday, September 29, 2007

El SQL básico ensambla

El primeros nos ensamblan cubrirán se llaman un equijoin, también llamado un interno ensamblan. Aquí es donde una columna (o las columnas múltiples) en dos o más tablas empareja. Por nuestro ejemplo:

SELECT emp.ename, dept.dname
FROM emp JOIN dept
ON emp.deptno = dept.deptno
/


Qué este selecto dice es seleccionar la columna del ename de la tabla del emp junto con la columna del dname en la tabla del departamento. Ensamblar el emp y el departamento comparando las columnas del deptno en cada uno para la igualdad.

Puedo pensar en por lo menos tres otras maneras de escribir esta pregunta en Oracle, pero creo que ésta es la manera más clara y más intuitiva de hacer tan. Puedes también ver la pregunta antedicha escrita como esto:

SELECT emp.ename, dept.dname
FROM emp INNER JOIN dept
ON emp.deptno = dept.deptno
/


Oracle omite automáticamente el JOIN a INNER para no requerir la palabra clave INNNER. Son la misma pregunta, aunque. Apenas prefiero no mecanografiar la palabra clave INNER.

Y cómo limitamos esto apenas al departamento de las SALES:

SELECT emp.ename, dept.dname
FROM emp JOIN dept
ON emp.deptno = dept.deptno
WHERE dept.dname = 'SALES'
/


Esto está consiguiendo útil ahora. La autorización, nos dejó volver a todos los empleados en las OPERATIONS del departamento.

SELECT emp.ename, dept.dname
FROM emp JOIN dept
ON emp.deptno = dept.deptno
WHERE dept.dname = 'OPERATIONS'
/


Uh, oh. No conseguimos ninguna fila vuelta. Si nos referimos de nuevo a nuestra pregunta anterior, podemos ver que hay un dname de operaciones, pero no tenemos ningún empleado en ese departamento. ¿Cómo podemos conseguir detrás un expediente con el dname? Necesitamos un OUTER JOIN. Un externo ensambla dice Oracle volver las filas a la izquierda o derecho (de la cláusula del JOIN) aunque no hay filas.

SELECT emp.ename, dept.dname
FROM emp RIGHT OUTER JOIN dept
ON emp.deptno = dept.deptno
WHERE dept.dname = 'OPERATIONS'
/


Notan que agregué la palabra clave RIGHT OUTER a la cláusula del JOIN. Eso dice que la vuelta las filas a la JOIN (en este caso DEPT) aunque allí no es ninguna fila a la izquierda (en este caso EMP).

Podríamos reescribir la pregunta como tal:

SELECT dept.dname, emp.ename
FROM dept LEFT OUTER JOIN emp
ON dept.deptno = emp.deptno
WHERE dept.dname = 'OPERATIONS'
/


En este caso, pusimos el DEPT a la izquierda y utilizamos un LEFT OUTER ensamblamos para conseguir los mismos resultados.

No comments:

My Zimbio
KudoSurf Me!