Tag Archives: sql

Obtener datos de multiples tablas en Oracle | JOIN

join

La sentencia JOIN en SQL permite combinar registros de dos o más tablas en una base de datos relacional. En el Lenguaje de Consultas Estructurado de Oracle (SQL) hay cinco tipos de JOINs: Natural JOIN, Self-join, Nonequijoins, Outer Join y Cross joins.

Matemáticamente, JOIN es composición relacional, la operación fundamental en el álgebra relacional, y, generalizando, es una función de composición.

Para entender como funciona la cláusula JOIN podemos ver el siguiente bloque de código

Podemos observar de forma reducida todos los tipos de JOIN que soporta una base de datos Oracle:

  • NATURAL JOIN une dos tablas basándose en las columnas que tengan el mismo nombre.
  • JOIN tabla2 USING nombre_columna realiza un equijoin basado en el nombre de columna que se especifica en la cláusula USING.
  • JOIN tabla2 ON tabla1.nombre_columna = tabla2.nombre_columna realiza un equijoin basado en la condición que se especifica en la cláusula ON.
  • LEFT / RIGHT / FULL OUTER son usados para realizar OUTER joins.
  • CROSS JOIN regresa un producto cartesiano de dos tablas.

Continue reading

Clausulas de limitación para ’SQL Row’ | Novedades Oracle 12c

Clausulas de limitación

En “Oracle Database 12c los mecanismos para limitar cantidad y modo de extracción de registros han tenido una mejora significativa, proveyéndonos de nuevas clausulas.

Podemos especificar la cantidad de registros a ser retornados utilizando las palabras claves: “FETCH”,”FIRST”,”NEXT”. También podemos especificar la cantidad de registros a ser retornados con la clausula “PERCENT”.

Con la clausula “OFFSET” podemos especificar la cantidad de registros deseados a partir del primer registro de un set de resultados complemento a la data que ya se ha obtenido.

Las consultas que generalmente utilizan este tipo de clausulas son conocidas como: “Top-N Queries”. Veamos un ejemplo práctico de esta característica:

Continue reading

Auto_increment en Oracle | Novedades Oracle 12c

Auto_increment en Oracle

Al momento de pasarte a trabajar con la Base de Datos de Oracle una de las primeras cosas que siempre preguntan los programadores es como hacen el auto_increment en Oracle o el Identity (sql server).

Anteriormente dicho procedimiento pasaba por crear una sequencia y posteriormente utilizarla en cualquier sentencia insert que realizaras sobre la tabla o creando un trigger (before insert for each row) para realizar dicho procedimiento, es decir, hacer lo siguiente:

Sin embargo a partir de ahora existen dos métodos para realizar el auto_increment en Oracle, el primero es asignar por default el valor de una secuencia o el segundo es crear una columna del tipo identidad.

Para mas información pueden consultar la documentación de Oracle

Clausula With | Novedades Oracle 12c

clausula with

Clausula WITH

A pesar de que ya van para 3 años de la salida de Oracle 12c, comenzaré a escribir un conjunto de artículos donde les traeré las novedades de la nueva y robusta base de datos de Oracle.

El día de hoy les hablaré de la clausula WITH, pero ojo no me refiero al ya conocido uso para simplificar sentencia sql complejas que utilizan subquerys, sino al uso de la misma al momento de crear funciones y procedimientos.

La clausula WITH permite la declaración de procedimientos y funciones que serán utilizadas en un mismo bloque de código PL/SQL, como ya se imaginaran se sigue la filosofía del with en consultas dml permitiendo un bloque dinámico de PL/SQL, optimizando los tiempos de ejecución con respecto al modelo de Program Units y sin necesidad de ser almacenados como objetos en la Base de datos.

Después de la teoría, nada mejor que un ejemplo de la clausula WITH

Actualizar tabla con inner join | Oracle

inner-join

Al momento de querer ejecutar un update en una base de datos de ORACLE al resultado de la union de dos tablas mediante la sentencia join lo mas probable es que ejecutemos un query como el siguiente:

UPDATE tabla1 t1
INNER JOIN tabla2 t2 ON t1.valor = t2.DESC and t1.fecha=t2.fecha
SET t1.valor = t2.CODE
WHERE t1.filtro='correcto';

Sin embargo nos arroja un error como el siguiente:

SQL Error: ORA-00933: SQL command not properly ended 00933. 00000 – “SQL command not properly ended”

Por lo tanto se pueden aplicar las siguientes alternativas:

¿Cómo eliminar acentos y caracteres especiales de una consulta de SQL|Oracle?

eliminar acentos oracle

eliminar acentos oracle

El día de hoy se creó la necesidad de devolver el resultado de un campo pero realizando una conversión para omitir los acentos y/o caracteres especiales, teniendo en cuenta que conozco la función replace para realizar este tipo de requerimientos, cree una función como la siguiente:

create function obtiene_nombre(primer_nombre varchar2,
segundo_nombre varchar2, primer_apellido varchar2, segundo_apellido
varchar2)
return varchar2 as
resultado varchar2(21);
begin

resultado:= SUBSTR(NVL(primer_apellido,segundo_apellido) || ' ' || NVL(primer_nombre,segundo_nombre),1,21);

resultado := REPLACE(resultado,'Ñ','N');
resultado := REPLACE(resultado,'á','a');
resultado := REPLACE(resultado,'Á','A');
resultado := REPLACE(resultado,'é','e');
resultado := REPLACE(resultado,'É','E');
resultado := REPLACE(resultado,'í','i');
resultado := REPLACE(resultado,'Í','I');
resultado := REPLACE(resultado,'ó','o');
resultado := REPLACE(resultado,'Ó','O');
resultado := REPLACE(resultado,'ú','u');
resultado := REPLACE(resultado,'Ú','U');
return RPAD(resultado,21);

end;
/

Posteriormente me di a la tarea de probarlo, realizando un query que devolvía un total de 8735 registros y que tenía una duración promedio de 360 milisegundos.

select
count(distinct obtiene_nombre(nombre,nombre2,apellido,apellido2) )
from empleados ;

Sin embargo leyendo en internet, conseguí la función TRANSLATE que se puede decir, agrupa varios replace en uno solo, para realizar algo parecido al función que realice, la forma de utilizarlo sería la siguiente:

select TRANSLATE('niñíto',
'ñáéíóúàèìòùãõâêîôôäëïöüçÑÁÉÍÓÚÀÈÌÒÙÃÕÂÊÎÔÛÄËÏÖÜÇ',
'naeiouaeiouaoaeiooaeioucNAEIOUAEIOUAOAEIOOAEIOUC') remplazo from dual;

Por lo tanto el query para medir el rendimiento de como eliminar acentos oracle quedaría de la siguiente manera

select
count(distinct RPAD( TRANSLATE(SUBSTR(NVL(apellido,apellido2) || ' ' || NVL(nombre,nombre2),1,21),'ñáéíóúàèìòùãõâêîôôäëïöüçÑÁÉÍÓÚÀÈÌÒÙÃÕÊÎÔÛÄËÏÖÜÇ', 'naeiouaeiouaoaeiooaeioucNAEIOUAEIOUAOAEIOOAEIOUC'),21) )
from empleados ;

Ofreciéndome los siguientes resultados:

  • El tiempo promedio de respuesta había bajado a 111 milisegundos
  • No se tuvo que desarrollar una función nueva
  • El código se redujo considerablemente

Nota: si están interesados en usar la función TRANSLATE en SQL Server (t-sql), les comento que la misma no existe, pero existen versiones creadas por gente de la comunidad para facilidad de los programadores. Pueden encontrar varias en el siguiente link: Translate en t-sql