Transact SQL, Unión de tablas (Join)

in spanish •  6 years ago  (edited)


En el uso de Transact SQL es la base para el manejo de bases de datos, ingresar, modificar y buscar data en las diferentes tablas son las operaciones básicas de toda estructura de datos.

Las consultas en transact se realizan a través de la instrucción select, la cual nos permite combinada con otras permite realizar complejas consultas de información; donde la instrucción base son algo así; select * from tabla, donde el * representa traerse todas las columnas de una tabla y from tabla nos indica la tabla sobre la cual se realizará la consulta.

La instrucción se puede complementar utilizando la instrucción where, esta instrucción precederá la utilización de condiciones, usadas para poder filtrar la información que traemos. Select * from tabla where condición es la forma de uso base de dicha instrucción.

Por otro lado no siempre es necesario utilizar todas las columnas de una tabla, cuando deseamos traer información de una tabla con gran tamaño, formada por muchas columnas y gran cantidad de registros, es conveniente identificar las columnas a utilizar, select columna1, columna3, columna7 from tabla where condición.

Realizar consultas con el mayor detalle de información a consultar, ayuda a optimizar los tiempos de respuesta de nuestras consultas. Traer todas las columnas de una consulta puede parecer conveniente, pensar que tener todas las columnas disponibles para hacer uso de ellas lejos de ser práctico, puede causar problemas en nuestro sistema. Traer tablas de gran tamaño sin filtrar ocasiona que tengamos que subir a memoria una cantidad de información innecesaria que debes ser manejada cada vez que realicemos la consulta.

La información que necesitamos puede encontrarse en diferentes tablas, traer diferentes columnas de varias tablas y generar una consulta completa, es algo muy común. Para esto la instrucción Join, esta nos permite realizar diferentes tipos de uniones, según la existencia o no de coincidencias en las tablas.

Join

Se puede usar join o inner join esta instrucción permite unir dos tablas que comparten una sección de información. De esta forma se puede extraer información según las coincidencias entre dos tablas como se muestra en la siguiente gráfica:

union.png

Sintaxis, select columnas from tabla1 inner join tabla2 on tabla1.columna común=tabla2.columna común , esta es la sintaxis básica. Al usarla se obtendrán todos los registros de ambas tablas donde coincidan las columnas de las tablas, dejando todos los demás por fuera.

Outer Join

Las uniones externas pueden trabajarse mediante left join_ y _right join, mientras que el inner join trae solo las coincidencias entre las dos tablas, estas instrucciones pueden traer incluso otra parte de la información no incluida en la unión.

En el vídeo podemos ver de forma práctica el uso de estos comando, donde usamos la base instalada de laboratorio en el post anterior.

Las estructuras utilizadas para los ejercicios de pruebas son las siguientes:

Script de creación de la tablas donde se almacenan los recibos formada por tblrecibobase y tblrecibodetalle, en conjunto guardan un recibo de cobro formado por un encabezado único y múltiples líneas. La información general se almacena en la base y las líneas en los detalles, esto con el objetivo de evitar repetir la información estática en cada línea. unidos por un campo de nombre refbase. Se usarán en la primera parte del laboratorio como muestra de unión de la data en dos tablas donde siempre hay una relación uno a muchos. Usan el campo refbase como columna de relación.


DROP TABLE IF EXISTS tblrecibobase;
CREATE TABLE tblrecibobase (
identificador int(10) unsigned NOT NULL auto_increment,
cedula varchar(13) NOT NULL default '',
apto varchar(7) NOT NULL default '',
alicuotaactual decimal(12,4) NOT NULL default '0.0000',
montomes decimal(12,2) NOT NULL default '0.00',
mes int(10) unsigned NOT NULL default '0',
etapa varchar(15) NOT NULL default '',
torre varchar(5) NOT NULL default '',
ano int(10) unsigned NOT NULL default '0',
refbase int(10) unsigned NOT NULL default '0',
cancelado tinyint(1) NOT NULL default '0',
montosindeuda decimal(12,2) NOT NULL default '0.00',
nota varchar(40) NOT NULL default '',
formapago varchar(20) NOT NULL default '',
nodocumento varchar(25) NOT NULL default '',
fecha date NOT NULL default '0000-00-00',
PRIMARY KEY (identificador)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS tblrecibodetalle;
CREATE TABLE tblrecibodetalle (
identificador int(10) unsigned NOT NULL auto_increment,
cedula varchar(13) NOT NULL default '',
monto decimal(13,2) NOT NULL default '0.00',
comun char(8) NOT NULL default '',
tipoinmueble varchar(13) NOT NULL default '',
inmueble varchar(17) NOT NULL default '',
tipogasto char(4) NOT NULL default '',
descripcion varchar(60) NOT NULL default '',
refbase int(10) unsigned NOT NULL default '0',
PRIMARY KEY (identificador)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Los scripts para crear los comprobantes contables comparten la misma filosofía de funcionamiento de los recibos, un encabezado y múltiples líneas, difieren al momento de crear la unión porque el campo de unión no coincide en nombre para tblbasecomprobante será identificador y para tbldetallecomprobante refbase. Esta particularidad permite estudiar la influencia de selección de nombres de campos claves y campos de referencia en el diseño de las tablas y su uso posterior para la sintaxis de las consulta mediante transact.

DROP TABLE IF EXISTS tblbasecomprobante;
CREATE TABLE tblbasecomprobante (
identificador bigint(20) unsigned NOT NULL auto_increment,
fecha date NOT NULL default '0000-00-00',
comentario varchar(120) NOT NULL default '',
tipocomprobante varchar(20) NOT NULL default '',
fecharegistro date NOT NULL default '0000-00-00',
procesado tinyint(1) NOT NULL default '0',
fechaprocesado date NOT NULL default '0000-00-00',
impreso tinyint(1) NOT NULL default '0',
anulado tinyint(1) NOT NULL default '0',
PRIMARY KEY (identificador)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS tbldetallecomprobante;
CREATE TABLE tbldetallecomprobante (
identificador bigint(20) unsigned NOT NULL auto_increment,
linea int(10) unsigned NOT NULL default '0',
cuenta varchar(10) NOT NULL default '',
descripcion varchar(70) NOT NULL default '',
comentario varchar(60) NOT NULL default '',
debe decimal(12,2) NOT NULL default '0.00',
haber decimal(12,2) NOT NULL default '0.00',
refbase bigint(20) unsigned NOT NULL default '0',
PRIMARY KEY (identificador)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Script de creación de la tabla de asientos contables, esta tabla es afectada por información proveniente de varias, no mantiene relación de uno a muchos con una sola, esto produce que exista al momento de la unión múltiples posibilidades de resultados, es el vídeo se realizarán pruebas con la tabla de comprobantes para estudiar la diversas forma de unión.

DROP TABLE IF EXISTS tblasientocontable;
CREATE TABLE tblasientocontable (
identificador int(10) unsigned NOT NULL auto_increment,
cuentacontable varchar(10) NOT NULL default '',
detalle varchar(60) NOT NULL default '',
debe decimal(12,2) NOT NULL default '0.00',
haber decimal(12,2) NOT NULL default '0.00',
fechaasiento date NOT NULL default '0000-00-00',
fechaproceso date NOT NULL default '0000-00-00',
nocomprobante int(10) unsigned NOT NULL default '0',
modulo int(10) unsigned NOT NULL default '0',
user varchar(10) NOT NULL default '',
refbase bigint(20) unsigned NOT NULL default '0',
linea bigint(20) unsigned NOT NULL default '0',
nogasto bigint(20) unsigned NOT NULL default '0',
PRIMARY KEY (identificador),
KEY FK_tblasientocontable_1 (cuentacontable)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Estos scripts pueden ejecutarse para crear las tablas de la práctica si alguien desea realizar ejercicios de pruebas. La data deberá ser generada por quien los desee utilizar. No coloco acceso a la data utilizada en los ejercicios, debido a que esta contiene información privada. Para la práctica se eligieron campos donde no se revelara información de este tipo en los ejercicios.

Por otro lado existen tablas accesorias donde se guarda información que se utiliza para complementar la carga de estas. Por ejemplo las cuentas contables se encuentran en una tabla donde se almacenan los números y su funcionamiento contable. El sistema trae la información de allí para la carga de la interface, puedes sin embargo cargar algunos códigos de prueba para esto de forma manual al momento de generar tu data.

Referencias

Toda la sintaxis de Transact SQL del manejador de bases de Datos MySql , puede ser consultada aquí. Documentación original del proyecto.

Imágenes

Gráfica realizada en Inkscape

Imagenes para la composición de la miniatura 1, 2


▶️ DTube
▶️ IPFS

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Recibe nuestro voto por parte del equipo de curación data-usb






Puedes chequear nuestro reporte diario haciendo click Aquí

Unete a nuestro servidor de discord para pertenecer a nuestra comunidad haciendo click Aquí



This post has been voted on by the steemstem curation team and voting trail.

There is more to SteemSTEM than just writing posts, check here for some more tips on being a community member. You can also join our discord here to get to know the rest of the community!

Gracias por el voto

Este post fue votado por la comunidad y trail @developspanish, comunidad encargada de curar a los programadores, traductores de software y bloggers de informática y tecnología de habla hispana.

Contenido de calidad
Votado por el trail Team-México @team-mexico
Canal Discord ¡Te esperamos!

Hola @UbaldoNet. Me ha gustado el contenido de tu post. Hay detalles de forma que te sugeriría que mejores para que tu artículo se vea estupendo. Éxito.

Gracias, me alegra te gustara. Es una serie de material del lenguaje, este es el segundo; en el primero video se monto la plataforma de pruebas en LAMP. Aun estoy viendo como terminar de ajustar el formato completo, para que el conjunto de post sean más útiles. El primero lo monte en Dlive pero no ayuda para montar el texto, por eso el segundo probé en Dtube. Creo que el resto serán allí.

MYTHOLOGY GIF.gif

Hi @ubaldonet!

Your post was upvoted by utopian.io in cooperation with steemstem - supporting knowledge, innovation and technological advancement on the Steem Blockchain.

Contribute to Open Source with utopian.io

Learn how to contribute on our website and join the new open source economy.

Want to chat? Join the Utopian Community on Discord https://discord.gg/h52nFrV

Gif_Medusa.gif