Una tabla (o una vista) puede referenciarse a sí misma. Para que esto sea posible debe tener 2 columnas (o más de 2 columnas) que tengan una relación entre sí.

Por ejemplo, tenemos una tabla llamada CUENTAS que mantiene los datos de las cuentas contables con esta estructura:

CUENTAS1

(haciendo click en la imagen la verás más grande)

y cuyas primeras filas son estas:

CUENTAS2

(haciendo click en la imagen la verás más grande)

En este caso en la columna CUE_NIVSUP (en la imagen se la llamó “Cuenta superior”) se coloca el número de la cuenta padre de cada cuenta. La cuenta ACTIVO no tiene cuenta superior porque no depende de ninguna otra cuenta. La cuenta ACTIVO CORRIENTE depende de ACTIVO, entonces esa es su cuenta superior. La cuenta DISPONIBILIDADES depende de ACTIVO CORRIENTE, entonces esa es su cuenta superior, y así sucesivamente.

Como se puede ver, el número registrado en la columna CUE_NIVSUP es un número de cuenta, un número que fue previamente registrado en la columna CUE_NUMERO.

Eso implica que entre ambas columnas (CUE_NUMERO y CUE_NIVSUP) hay una relación: todos los números de cuenta que pueden registrarse en la columna CUE_NIVSUP deben existir en la columna CUE_NUMERO.

Supongamos ahora que deseamos ver una consulta similar a la de arriba pero no solamente con los números de las cuentas de nivel superior sino también con sus respectivos nombres. En este caso, estaríamos relacionando a la tabla de CUENTAS con sí misma, porque ambas columnas pertenecen a la misma tabla.

La tabla de CUENTAS tiene un índice según las columnas: CUE_ANOEJE, CUE_CODSUC, CUE_NUMERO, CUE_NUMSUB, entonces esta consulta nos mostrará el resultado deseado.

SELECT
   C.CUE_IDENTI AS "Identi",
   C.CUE_ANOEJE AS "Año",
   C.CUE_CODSUC AS "Suc.",
   C.CUE_NUMERO AS "Número",
   C.CUE_NUMSUB AS "NumSub",
   C.CUE_NOMBRE AS "Nombre de la cuenta",
   C.CUE_NIVSUP AS "Cuenta superior",
   D.CUE_NOMBRE AS "Nombre cuenta superior",
   C.CUE_NIVELX AS "Nivel",
   C.CUE_ASENTA AS "Asentable"
FROM
   CUENTAS C
JOIN
   CUENTAS D
      ON C.CUE_ANOEJE = D.CUE_ANOEJE AND
         C.CUE_CODSUC = D.CUE_CODSUC AND
         C.CUE_NIVSUP = D.CUE_NUMERO AND
         D.CUE_NUMSUB = ''
WHERE
   C.CUE_ANOEJE = 2008

Lo que obtendremos al ejecutar ese SELECT será esto:
CUENTAS3
(haciendo click en la imagen la verás más grande)

que es casi, casi, lo que deseamos. Las que están faltando son las cuentas de nivel 1, o sea todas las cuentas que no tienen una cuenta superior. Eso es muy fácil de solucionar (en lugar de un INNER JOIN escribiríamos un LEFT JOIN y listo).

Lo importante de este ejemplo es ver como una tabla puede relacionarse a sí misma. Para ello la tabla principal (la que se encuentra a continuación de la cláusula FROM) debe ser la misma que la tabla secundaria (la que se encuentra a continuación de la cláusula JOIN) pero para poder diferenciarlas deben tener alias (en este ejemplo se usó el alias “C” para la tabla principal y el alias “D” para la tabla secundaria).


					
Anuncios