Вы находитесь на странице: 1из 7

Consultas combinadas.

Cuando necesitamos consultar informacin de una base de datos nos encontramos


que en muchas ocasiones dicha informacin se encuentra repartida en varias tablas,
que tienen referencia entre si por un campo llave. Esta forma de almacenar la
informacin a veces resulta poco til a la hora de consultar los datos. SQL nos
proporciona una forma fcil de mostrar la informacin repartida en varias tablas, las
consultas combinadas o JOINS.
Las consultas combinadas pueden ser de dos tipos:
Combinacin interna
Combinacin externa
Combinacin interna.
La combinacin interna nos permite mostrar los datos de dos o ms tablas a travs de
una condicin WHERE, donde se hace la relacin con los campos llave. Para realizar
la consulta combinada entre estas dos tablas debemos escribir una consulta SELECT
en cuya clusula FROM escribiremos el nombre de las dos tablas, separados por
comas, y una condicin WHERE que obligue a tomar los campos de las llaves.
Lo ms sencillo es ver un ejemplo directamente:
SELECT tCarro.matricula,
tMarca.marca,
tCarro.modelo,
tCarro.color,
tCarro.numero_kilometros,
tCarro.num_plazas
FROM tCarro, tMarca
WHERE tCarro.marca = tMarca.codigo
Otra opcin es utilizar la clusula INNER JOIN. Su sintaxis es identica a la de una
consulta SELECT habitual, con la particularidad de que n la clusula FROM slo
aparece una tabla o vista, aadiendose el resto de tablas a travs de clusulas INNER
JOIN .

SELECT [ALL | DISTINCT ]


[{,}]
FROM
[{INNER JOIN ON }]
[WHERE [{ AND|OR }]]
[GROUP BY [{,}]]
[HAVING [{ AND|OR }]]
[ORDER BY | [ASC | DESC]
[{,| [ASC | DESC ]}]]
La clusula INNER JOIN permite separar completamente las condiciones de
combinacin con otros criterios, cuando tenemos consultas que combinan nueve o
diez tablas esto es realmente til.
Combinacin Externa
La combinacin interna es excluyente. Esto quiere decir que si un registro no cumple
la condicin de combinacin no se incluye en los resultados. Segn la naturaleza de
nuestra consulta esto puede ser una ventaja, pero en otros casos significa un
problema. Para modificar este comportamiento SQL pone a nuestra disposicin la
Combinacin Externa. La combinacin externa no es excluyente.
La sintaxis es muy parecida a la combinacin interna,
SELECT [ALL | DISTINCT ]
[{,}]
FROM
[{LEFT|RIGHT OUTER JOIN ON }]
[WHERE [{ AND|OR }]]
[GROUP BY [{,}]]
[HAVING [{ AND|OR }]]
[ORDER BY | [ASC | DESC]
[{,| [ASC | DESC ]}]]
La combinacin externa puede ser diestra o siniestra, LEFT OUTER JOIN o RIGHT
OUTER JOIN. Con LEFT OUTER JOIN obtenemos todos los registros de en la tabla
que se enecuentren a la izquierda de la clausula JOIN, mientras que con RIGHT
OUTER JOIN obtenemos el efecto contrario.

Combina los resultados de dos o ms consultas en un solo conjunto de resultados que


incluye todas las filas que pertenecen a las consultas de la unin. La operacin UNION
es distinta de la utilizacin de combinaciones de columnas de dos tablas.
A continuacin se muestran las reglas bsicas para combinar los conjuntos de
resultados de dos consultas con UNION:
El nmero y el orden de las columnas debe ser el mismo en todas las consultas.
Los tipos de datos deben ser compatibles.

UNION
Convenciones de sintaxis de Transact-SQL

Sintaxis
{ <query_specification> | ( <query_expression> ) }
UNION [ ALL ]
<query_specification | ( <query_expression> )
[ UNION [ ALL ] <query_specification> | ( <query_expression> )
[ ...n ] ]

Argumentos
<query_specification> | ( <query_expression> )
Es una especificacin o expresin de consulta que devuelve datos que se van a
combinar con los datos de otra especificacin o expresin de consulta. No es
preciso que las definiciones de las columnas que forman parte de una operacin
UNION sean iguales, pero deben ser compatibles a travs de una conversin
implcita. Cuando los tipos de datos difieren, el tipo de datos resultante se
determina segn las reglas de prioridad de tipos de datos. Cuando los tipos son
los mismos pero varan en cuanto a precisin, escala o longitud, el resultado se
determina segn las mismas reglas para combinar expresiones. Para obtener
ms informacin, vea Precisin, escala y longitud (Transact-SQL).
Las columnas del tipo de datos xml deben ser equivalentes. Todas las columnas
deben tener un tipo de esquema XML o no tener tipo. Si tienen tipo, debe ser el
de la misma coleccin de esquemas XML.
UNION
Especifica que se deben combinar varios conjuntos de resultados para ser
devueltos como un solo conjunto de resultados.
ALL
Agrega todas las filas a los resultados. Incluye las filas duplicadas. Si no se
especifica, las filas duplicadas se quitan.

Ejemplos
A.Usar una instruccin UNION simple
En el siguiente ejemplo, el conjunto de resultados incluye el contenido de las
columnas ProductModelID y Name de las tablas ProductModel y Gloves.
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;

GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
-- Here is the simple union.
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO

B.Usar SELECT INTO con UNION


En el siguiente ejemplo, la clusula INTO de la segunda instruccin SELECT especifica
que la tabla denominada ProductResults contiene el conjunto final de resultados de la
unin de las columnas designadas de las tablas ProductModel y Gloves. Tenga en
cuenta que la tabla Gloves se crea en la primera instruccin SELECT.
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.ProductResults', 'U') IS NOT NULL
DROP TABLE dbo.ProductResults;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
INTO dbo.ProductResults
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;

GO
SELECT ProductModelID, Name
FROM dbo.ProductResults;

C.Usar UNION con dos instrucciones SELECT y ORDER BY


El orden de algunos parmetros empleados con la clusula UNION es importante. En el
siguiente ejemplo se muestra el uso correcto e incorrecto de UNION en dos
instruccionesSELECT en las que se va a cambiar el nombre de una columna en el
resultado.
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
/* INCORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
/* CORRECT */
USE AdventureWorks2012;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO

D.Usar UNION de tres instrucciones SELECT para mostrar los efectos


de ALL y los parntesis

En los siguientes ejemplos se utiliza UNION para combinar los resultados de tres tablas
que tienen las mismas 5 filas de datos. En el primer ejemplo se utiliza UNION ALL para
mostrar los registros duplicados y se devuelven las 15 filas. En el segundo ejemplo se
utiliza UNION sin ALL para eliminar las filas duplicadas de los resultados combinados de
las tres instrucciones SELECT y se devuelven 5 filas.
En el tercer ejemplo se utiliza ALL con el primer UNION y los parntesis incluyen al
segundo UNION que no utiliza ALL. El segundo UNION se procesa en primer lugar
porque se encuentra entre parntesis. Devuelve 5 filas porque no se utiliza la
opcin ALL y se quitan los duplicados. Estas 5 filas se combinan con los resultados del
primer SELECTmediante las palabras clave UNION ALL. Esto no quita los duplicados
entre los dos conjuntos de 5 filas. El resultado final es de 10 filas.
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.EmployeeOne', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeOne;
GO
IF OBJECT_ID ('dbo.EmployeeTwo', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeTwo;
GO
IF OBJECT_ID ('dbo.EmployeeThree', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeThree;
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeOne
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeTwo
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeThree
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Union ALL
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne
UNION ALL
SELECT LastName, FirstName ,JobTitle
FROM dbo.EmployeeTwo
UNION ALL
SELECT LastName, FirstName,JobTitle

FROM dbo.EmployeeThree;
GO
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeOne
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree;
GO
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeOne
UNION ALL
(
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree
);
GO

Вам также может понравиться