Cómo utilizar consultas sql anidadas que devuelven conjuntos de filas

Para ilustrar cómo una consulta SQL anidada devuelve un conjunto de filas, imagine que usted trabaja para un integrador de sistemas de equipos informáticos. Su empresa, Trend Corporation, ensambla sistemas a partir de componentes que se compran, y luego los vende a empresas y agencias gubernamentales. Se hace un seguimiento de su negocio con una base de datos relacional.

La base de datos se compone de muchas mesas, pero en este momento usted está preocupado con sólo tres de ellos: la tabla de productos, la mesa COMP_USED, y la tabla de componentes. La tabla producto contiene una lista de todos sus productos estándar.

ColumnaTiporestricciones
ModeloCHAR (6)PRIMARY KEY
ProdNameCHAR (35)
ProdDescCHAR (31)
Precio de listaNumérico (9,2)

La tabla de componentes enumera los componentes que intervienen en sus productos.

ColumnaTiporestricciones
compidCHAR (6)PRIMARY KEY
COMPTYPECHAR (10)
CompDescCHAR (31)

Las pistas de mesa COMP_USED los componentes que intervienen en cada producto.

ColumnaTiporestricciones
ModeloCHAR (6)CLAVE EXTERNA (para PRODUCTO)
compidCHAR (6)CLAVE EXTERNA (para COMPONENTE)

Un componente puede ser utilizado en múltiples productos, y un producto puede contener varios componentes (una relación de muchos a muchos). Esta situación puede causar problemas de integridad. Para eludir los problemas, crear la tabla de vinculación COMP_USED relacionar a COMPONENTE DE PRODUCTOS. Un componente puede aparecer en muchas filas de la tabla COMP_USED, pero cada una de esas filas hará referencia a sólo un componente (una relación de uno a muchos).

Del mismo modo, un producto puede aparecer en muchas filas en COMP_USED, pero cada fila referencias solamente un producto (otra relación de uno a muchos). La adición de la tabla de vinculación transforma una relación problemático muchos-a-muchos en dos relativamente simples relaciones de uno a muchos. Este proceso de reducción de la complejidad de las relaciones es un ejemplo de normalización.

Subconsultas introducidas por la palabra clave IN

Una forma de una consulta anidada compara un valor único con el conjunto de valores devueltos por una SELECCIONAR declaración. Utiliza el EN predicado con la siguiente sintaxis:

SELECCIONAR column_listDE mesaDONDE expresión IN (subconsulta) -

La expresión en el DÓNDE cláusula se evalúa como un valor. Si ese valor es EN la lista devuelta por la subconsulta, entonces el DÓNDE cláusula devuelve un valor verdadero. Las columnas especificadas de la fila de la tabla que se procesan se añaden a la tabla de resultados. La subconsulta puede hacer referencia a la misma tabla referenciada por la consulta externa, o puede hacer referencia a una tabla diferente.

En el siguiente ejemplo, base de datos de la Zetec se utiliza para demostrar este tipo de consulta. Supongamos que hay una escasez de monitores de ordenador en la industria informática, de manera que cuando se acaba de monitores, ya no se puede entregar los productos que los incluyen. ¿Quieres saber qué productos se ven afectados. Al mirar con gratitud a su propio monitor, introduzca la siguiente consulta:

SELECT ModelFROM COMP_USEDWHERE compid IN (SELECT CompIDFROM COMPONENTWHERE COMPTYPE = ‘Monitor’) -

SQL procesa la consulta interna en primer lugar, por lo que procesa la tabla de componentes, devolviendo el valor de compid para cada fila donde COMPTYPE es `Monitor`. El resultado es una lista de las CARNÉ DE IDENTIDAD los números de todos los monitores. La consulta externa compara entonces el valor de compid en cada fila de la tabla COMP_USED con la lista.

Si la comparación tiene éxito, el valor de la Modelo columna de esa fila se añade a la exterior SELECCIONAR‘S tabla de resultados. El resultado es una lista de todos los modelos de productos que incluyen un monitor. El siguiente ejemplo muestra lo que sucede cuando se ejecuta la consulta:

Modelo ----- CX3000CX3010CX3020MB3030MX3020MX3030

Ahora ya sabe qué productos pronto estarán fuera de stock. Es hora de ir a la fuerza de ventas y les digo que reducir la velocidad en la promoción de estos productos.

Cuando se utiliza esta forma de consulta anidada, la subconsulta debe especificar una sola columna, y el tipo de datos de esa columna debe coincidir con el tipo de datos del argumento anterior a la EN palabra clave.

Con suerte, usted recuerda el principio KISS. Mantener las cosas simples Es importante cuando se trata con el software de cualquier tipo, pero es especialmente importante cuando se trata de software de base de datos. Las declaraciones que incluyen anidadas SELECCIONARs puede ser difícil hacerlo bien.

Una manera de hacer que funcionen como deberían es ejecutar el interior SELECCIONAR por sí mismo primero y luego verificar que el resultado que se obtiene es el resultado que espera. Cuando esté seguro de lo interno SELECCIONAR está funcionando correctamente, puede encerrarlo en la parte exterior de la declaración y tener una mejor oportunidad de que todo funciona como se anuncia.

Subconsultas introducidas por la palabra clave NO EN

Del mismo modo que se puede introducir un sub consulta con el EN palabra clave, puede hacer lo contrario e introducirlo con el NO EN palabras clave. De hecho, ahora es un buen momento para la gestión Zetec para realizar dicha consulta. gestión Zetec descubrió lo que los productos no se venden. Esa es una información valiosa, pero la dirección lo Zetec realmente quiere saber es qué productos a vender.

La administración desea hacer hincapié en la venta de productos que no hacer contener monitores. Una consulta anidada con una subconsulta introducida por la NO EN palabras clave proporciona la información solicitada:

SELECT ModelFROM COMP_USEDWHERE compid NO EN (SELECCIONAR CompIDFROM COMPONENTWHERE COMPTYPE = `Monitor`)) -

Esta consulta produce el siguiente resultado:

Video: Curso SQL. Consultas de agrupación o totales. Vídeo 5

Modelo ----- PX3040PB3050PX3040PB3050

En el ejemplo, el número de filas no crea un problema porque la tabla de resultados es corto. En el mundo real, tal tabla resultado puede tener cientos o miles de filas. Para evitar confusiones, lo mejor es eliminar duplicados. Puede hacerlo fácilmente mediante la adición de la DISTINTO palabra clave para la consulta. Sólo las filas que son distintas de todas las filas recuperados previamente se añaden a la tabla de resultados:

SELECT DISTINCT ModelFROM COMP_USEDWHERE compid NO EN (SELECCIONAR CompIDFROM COMPONENTWHERE COMPTYPE = `Monitor`)) -

Como era de esperar, el resultado es el siguiente:

Video: 07. Consultas Anidadas - BD_TECNOLOGÍA

Modelo ----- PX3040PB3050
Artículos Relacionados