domingo, 16 de mayo de 2010

Intersect

Alguna vez platicaba con algunos compañeros expresándoles que SQL Server no solo son sentencias Insert y Select, es necesario que nosotros como desarrolladores conozcamos las diferentes ofertas que nos da SQL para resolver diferentes problemas.
En esta ocasión quiero platicarles de una nueva forma de unir tablas que esta disponible desde SQL Server 2005 y esto es con la instrucción Intersect.
Para poder ejemplificar y buscar dejar claro este tema crearemos un par de tablas y ejecutaremos una unión con INNER y la otra con Intersect para mostrar las diferencias.

Create Table dbo.Tbl_Clientes
(
IdCliente Int Identity(1,1) Primary key
,Nombre varchar(200)
,observaciones varchar(400)
)
Go

Insert into dbo.Tbl_Clientes
Values ('Cliente 1','NA');
Insert into dbo.Tbl_Clientes
Values ('Cliente 2','NA');
Insert into dbo.Tbl_Clientes
Values ('Cliente 3','NA');
Insert into dbo.Tbl_Clientes
Values ('Cliente 4','NA');

Go

Create Table dbo.Tbl_Facturas
(
IdFactura Int Identity(1,1) primary key
,idCliente Int Not null
,Fecha Datetime Not null Default Getdate()
,Iva float Not null
,Importe float Not null
,Total float Not null
,Observaciones varchar(max)
)
GO
Alter Table dbo.Tbl_Facturas add Constraint Fk_Cliente
Foreign key (idCliente) References dbo.Tbl_Clientes(IdCliente)
Select IdCliente,Nombre from dbo.Tbl_Clientes;
Insert dbo.Tbl_Facturas
Values (1,getdate(),16,100,116,'Factura A');

Insert dbo.Tbl_Facturas
Values (1,getdate(),16,100,116,'Factura A.1');

Insert dbo.Tbl_Facturas
Values (1,getdate(),16,100,116,'Factura A.2');

Insert dbo.Tbl_Facturas
Values (2,getdate(),16,100,116,'Factura B');

Insert dbo.Tbl_Facturas
Values (3,getdate(),16,100,116,'Factura A');

Insert dbo.Tbl_Facturas
Values (4,getdate(),16,100,116,'Factura A');

Select IdFactura ,idCliente ,Fecha ,Iva ,Importe ,Total ,Observaciones From dbo.Tbl_Facturas
Ahora veremos justamente las diferencias entre usar INNER e Intersect

Al crear un Select con una union interna veremos que nos regresa seis filas
Select Tbl_Clientes.IdCLiente from dbo.Tbl_Clientes
Inner join dbo.Tbl_Facturas on Tbl_Clientes.IDCliente=Tbl_Facturas.IDCliente

Si agregamos la condiciòn Distinct recuperamos cuatro filas
Select Distinct Tbl_Clientes.IdCLiente from dbo.Tbl_Clientes
Inner join dbo.Tbl_Facturas on Tbl_Clientes.IDCliente=Tbl_Facturas.IDCliente

Si hacemos uso de Intersect veremos que hace lo mismo que el anterior pero de una forma mas facil
Select IdCliente from dbo.Tbl_Clientes
Intersect
Select IdCliente from dbo.Tbl_Facturas


Es decir, Intersect devuelve los valores distintos retornados por las consultas del lado izquierdo y derecho de la consulta
La condición que tenemos para poder utilizar Intersect es que las consultas que estamos ejecutando tengan las mismas columnas y tipo de datos
Saludos y hasta la proxima

No hay comentarios:

Publicar un comentario