Compartir a través de


Cómo: Crear consultas a partir de otro objeto distinto de una tabla

Al escribir una consulta de recuperación, puede enunciar qué columnas y qué filas desea obtener y dónde tiene que buscar el procesador de consultas los datos originales. Normalmente, estos datos originales están formados por una o varias tablas combinadas entre sí. Pero los datos originales pueden venir de orígenes que no sean tablas. De hecho, pueden provenir de vistas, consultas, sinónimos o funciones definidas por el usuario que devuelven una tabla.

Utilizar una vista en lugar de una tabla

Puede seleccionar filas en una vista. Por ejemplo, supongamos que la base de datos incluye una vista denominada "ExpensiveBooks", en la que cada fila describe un título cuyo precio supera 19,99. La definición de vista puede tener la forma siguiente:

SELECT *
FROM titles
WHERE price > 19.99

Puede seleccionar los libros de psicología caros simplemente mediante la selección de libros de psicología de la vista ExpensiveBooks. El código SQL resultante puede presentar el siguiente aspecto:

SELECT *
FROM ExpensiveBooks
WHERE type = 'psychology'

De igual manera, una vista puede participar en una operación JOIN. Por ejemplo, puede buscar las ventas de libros caros simplemente mediante la combinación de la tabla sales con la vista ExpensiveBooks. El código SQL resultante puede presentar el siguiente aspecto:

SELECT *
FROM sales 
         INNER JOIN 
         ExpensiveBooks 
         ON sales.title_id 
         =  ExpensiveBooks.title_id

Para obtener más información sobre cómo agregar una vista en una consulta, vea Cómo: Agregar tablas a las consultas.

Utilizar una consulta en lugar de una tabla

Puede seleccionar filas de una consulta. Por ejemplo, supongamos que ya ha escrito una consulta que recupera títulos e identificadores de los libros realizados por coautores (libros realizados por más de un autor). El código SQL resultante puede presentar el siguiente aspecto:

SELECT 
     titles.title_id, title, type
FROM 
     titleauthor 
         INNER JOIN
         titles 
         ON titleauthor.title_id 
         =  titles.title_id 
GROUP BY 
     titles.title_id, title, type
HAVING COUNT(*) > 1

Seguidamente, puede escribir otra consulta que se base en este resultado. Por ejemplo, puede escribir una consulta que recupere los libros de psicología realizados por coautores. Para escribir esta consulta nueva, puede utilizar la consulta existente como origen de datos de la nueva consulta. El código SQL resultante puede presentar el siguiente aspecto:

SELECT 
    title
FROM 
    (
    SELECT 
        titles.title_id, 
        title, 
        type
    FROM 
        titleauthor 
            INNER JOIN
            titles 
            ON titleauthor.title_id 
            =  titles.title_id 
    GROUP BY 
        titles.title_id, 
        title, 
        type
    HAVING COUNT(*) > 1
    ) 
    co_authored_books
WHERE     type = 'psychology'

El texto resaltado muestra la consulta existente utilizada como origen de los datos de la nueva consulta. Tenga en cuenta que la consulta nueva utiliza un alias ("co_authored_books") para la consulta existente. Para obtener más información sobre los alias, vea Cómo: Crear alias de tabla y Cómo: Crear alias de columna.

De igual manera, una consulta puede participar en una operación JOIN. Por ejemplo, puede buscar las ventas de libros caros realizados por coautores simplemente mediante la combinación de la vista ExpensiveBooks con la consulta que recupera los libros realizados por coautores. El código SQL resultante puede presentar el siguiente aspecto:

SELECT 
    ExpensiveBooks.title
FROM 
    ExpensiveBooks 
        INNER JOIN
        (
        SELECT 
            titles.title_id, 
            title, 
            type
        FROM 
            titleauthor 
                INNER JOIN
                titles 
                ON titleauthor.title_id 
                =  titles.title_id 
        GROUP BY 
            titles.title_id, 
            title, 
            type
        HAVING COUNT(*) > 1
        )

Para obtener más información sobre cómo agregar una consulta en otra consulta, vea Cómo: Agregar tablas a las consultas.

Utilizar una función definida por el usuario en lugar de una tabla

En SQL Server 2000 o superior, puede crear una función definida por el usuario que devuelva una tabla. Estas funciones son útiles para realizar lógica de procedimientos o compleja.

Por ejemplo, supongamos que la tabla de empleados (employee) contiene una columna adicional (employee.manager_emp_id) y que existe una clave externa de manager_emp_id a employee.emp_id. De esa forma, en cada fila de la tabla employee, la columna manager_emp_id se referirá al jefe de cada empleado. Por ser más exactos, se referirá al emp_id del jefe del empleado. Puede crear una función definida por el usuario que devuelva una tabla que contenga una fila para cada empleado que trabaje en una determinada jerarquía organizativa de un director de alto nivel. Puede llamar a la función fn_GetWholeTeam y diseñarla para que tome una variable de entrada: el emp_id del director cuyo equipo desea recuperar.

Puede escribir una consulta que utilice la función fn_GetWholeTeam como origen de datos. El código SQL resultante puede presentar el siguiente aspecto:

SELECT * 
FROM 
     fn_GetWholeTeam ('VPA30890F')

"VPA30890F" es el emp_id del director cuya organización desea recuperar. Para obtener más información sobre cómo agregar una función definida por el usuario en una consulta, vea Cómo: Incluir funciones definidas por el usuario en las consultas y Cómo: Agregar tablas a las consultas. Para obtener una descripción completa de las funciones definidas por el usuario, consulte la documentación de SQL Server.

Vea también

Otros recursos

Trabajar con procedimientos almacenados y funciones definidas por el usuario