locked
Para que se usa en SQL Server la Clausula "WITH y UNION"

    Question

  • Hola a todos, como andan???

    Bueno tengo la siguiente tabla con algunos registros agregados…

     

    CREATE TABLE [dbo].[employe](

         [empId] [int] NOT NULL,

         [name] [varchar](50) NULL,

         [mgr_id] [int] NULL,

     CONSTRAINT [PK__employe__AFB3EC0D5165187F] PRIMARY KEY CLUSTERED

     CONSTRAINT fk_employe_mrg_id FOREIGN KEY (mgr_id) REFERENCES employe(empId)

     

    INSERT INTO employe VALUES(1, 'Pedro Perez', NULL)

    INSERT INTO employe VALUES(2, 'Ramon Juan', 1)

    INSERT INTO employe VALUES(3, 'Pepito Perez', 1)

    INSERT INTO employe VALUES(4, 'Juana Petra', 3)

    INSERT INTO employe VALUES(5, 'Carlos Montelo', 4)

     

    Quiero aprender a trabajar con esas consultas que usan With “no se como se llama realmente ese tipo de consultas”

     

    Aquí hay un ejemplo…

     

    WITH manager_cte AS

    (

         SELECT empId, name, mgr_id, 1 AS LEVEL

         FROM employe

         where mgr_id is null

         UNION ALL

         SELECT Emp.empId, Emp.name, Emp.mgr_id, mng.LEVEL + 1 AS LEVEL

         FROM employe Emp

         INNER JOIN manager_cte mng

         ON mng.empId = Emp.mgr_id

    )

    SELECT * FROM manager_cte ORDER BY LEVEL

     

    Sera que alguien me explica que hace esa function como tal… Según lo que le son como ciclos de consultas o algo asi…

    Me gustaría saber que es

    -        With

    -        Union

    -        Level

    Según lo que lei Union son uniones “jeje” pero no comprendo del todo, será que alguien me lo explica mejor con algún ejemplo didáctico si no es mucha molestia…

    Tambien tengo otra duda.. Para que yo quisiera hacer una relacion de un campo de una tabla con otro campo de la misma... No entiendo para que se querria hacer eso... Algun ejemplo de uso?

    De antemano mil gracias a todos por su gran ayuda…

    Saturday, May 22, 2010 11:10 PM

Answers

  • Hola.

    Eso son CTEs o common table expressions o expresiones de table comunes. Me gusta explicarlas refiriéndome a ellas como una especie de vistas temporales. Este caso que expones es de los más interesantes, las CTEs recursivas.

    Son muy interesantes porque abren un importante abanico de posibilidades. Aquí tienes la teoría: http://msdn.microsoft.com/es-es/library/ms186243.aspx y aquí un ejemplo práctico de uso: http://qwalgrande.blogspot.es/1255098540/me-gustan-las-ctes-(tabla-de-dias)/

    Estas construcciones requieren de una sintaxis concreta que precisa el uso de algunas palabras reservadas, como ";with". Es importante lo del ";". Como su nombre indica, viene a significar "Con esta consulta, ejecútame esta otra".

    Sobre "Union", necesario para montar la recursividad, es un concepto previo. Sirve para juntar dos conjuntos de registros. Puedes encontrar explicación detallada en los books online: http://msdn.microsoft.com/es-es/library/ms180026.aspx y aquí varios ejemplos: http://msdn.microsoft.com/en-us/library/ms187731.aspx (en la versión en español faltan las consultas).

    Level (para identificar el nivel de aislamiento, set transaction isolation level read uncommitted, por ejemplo) es palabra reservada, pero aquí es usada como alias de un campo. Es decir, de casualidad. Lo puedes sustituir por "nivel" en tu consulta para evitar la confusión.

    Sobre relacionar un campo de una tabla con otro de la misma, el típico ejemplo es el de las tablas que almacenan jerarquías, como por ejemplo una tabla de empleados, que tiene un campo IdEmpleado y un campo IdJefe que informa del superior del empleado y que a su vez es otro registro dentro de la tabla de empleados.

    De todos modos, y con el debido respeto, creo que no es adecuado plantearte el uso de CTEs en este momento, cuando no tienes dominados conceptos mucho más básicos, como las consultas de unión. Está muy bien que seas ambicioso, pero para que realices un progreso más sólido has de ir paso a paso.

    En cualquier caso, no dejes de preguntar, por ejemplo en este foro.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    Sunday, May 23, 2010 9:10 AM

All replies

  • Hola.

    Eso son CTEs o common table expressions o expresiones de table comunes. Me gusta explicarlas refiriéndome a ellas como una especie de vistas temporales. Este caso que expones es de los más interesantes, las CTEs recursivas.

    Son muy interesantes porque abren un importante abanico de posibilidades. Aquí tienes la teoría: http://msdn.microsoft.com/es-es/library/ms186243.aspx y aquí un ejemplo práctico de uso: http://qwalgrande.blogspot.es/1255098540/me-gustan-las-ctes-(tabla-de-dias)/

    Estas construcciones requieren de una sintaxis concreta que precisa el uso de algunas palabras reservadas, como ";with". Es importante lo del ";". Como su nombre indica, viene a significar "Con esta consulta, ejecútame esta otra".

    Sobre "Union", necesario para montar la recursividad, es un concepto previo. Sirve para juntar dos conjuntos de registros. Puedes encontrar explicación detallada en los books online: http://msdn.microsoft.com/es-es/library/ms180026.aspx y aquí varios ejemplos: http://msdn.microsoft.com/en-us/library/ms187731.aspx (en la versión en español faltan las consultas).

    Level (para identificar el nivel de aislamiento, set transaction isolation level read uncommitted, por ejemplo) es palabra reservada, pero aquí es usada como alias de un campo. Es decir, de casualidad. Lo puedes sustituir por "nivel" en tu consulta para evitar la confusión.

    Sobre relacionar un campo de una tabla con otro de la misma, el típico ejemplo es el de las tablas que almacenan jerarquías, como por ejemplo una tabla de empleados, que tiene un campo IdEmpleado y un campo IdJefe que informa del superior del empleado y que a su vez es otro registro dentro de la tabla de empleados.

    De todos modos, y con el debido respeto, creo que no es adecuado plantearte el uso de CTEs en este momento, cuando no tienes dominados conceptos mucho más básicos, como las consultas de unión. Está muy bien que seas ambicioso, pero para que realices un progreso más sólido has de ir paso a paso.

    En cualquier caso, no dejes de preguntar, por ejemplo en este foro.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    Sunday, May 23, 2010 9:10 AM
  • Hola.

    Eso son CTEs o common table expressions o expresiones de table comunes. Me gusta explicarlas refiriéndome a ellas como una especie de vistas temporales. Este caso que expones es de los más interesantes, las CTEs recursivas.

    Son muy interesantes porque abren un importante abanico de posibilidades. Aquí tienes la teoría: http://msdn.microsoft.com/es-es/library/ms186243.aspx y aquí un ejemplo práctico de uso: http://qwalgrande.blogspot.es/1255098540/me-gustan-las-ctes-(tabla-de-dias)/

    Estas construcciones requieren de una sintaxis concreta que precisa el uso de algunas palabras reservadas, como ";with". Es importante lo del ";". Como su nombre indica, viene a significar "Con esta consulta, ejecútame esta otra".

    Sobre "Union", necesario para montar la recursividad, es un concepto previo. Sirve para juntar dos conjuntos de registros. Puedes encontrar explicación detallada en los books online: http://msdn.microsoft.com/es-es/library/ms180026.aspx y aquí varios ejemplos: http://msdn.microsoft.com/en-us/library/ms187731.aspx (en la versión en español faltan las consultas).

    Level (para identificar el nivel de aislamiento, set transaction isolation level read uncommitted, por ejemplo) es palabra reservada, pero aquí es usada como alias de un campo. Es decir, de casualidad. Lo puedes sustituir por "nivel" en tu consulta para evitar la confusión.

    Sobre relacionar un campo de una tabla con otro de la misma, el típico ejemplo es el de las tablas que almacenan jerarquías, como por ejemplo una tabla de empleados, que tiene un campo IdEmpleado y un campo IdJefe que informa del superior del empleado y que a su vez es otro registro dentro de la tabla de empleados.

    De todos modos, y con el debido respeto, creo que no es adecuado plantearte el uso de CTEs en este momento, cuando no tienes dominados conceptos mucho más básicos, como las consultas de unión. Está muy bien que seas ambicioso, pero para que realices un progreso más sólido has de ir paso a paso.

    En cualquier caso, no dejes de preguntar, por ejemplo en este foro.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)


    Hola amigo, Mmm, Tienes toda la razon respecto a ir paso a paso... muchas gracias igual dejame hecharle una lectura y cualquier cosa te pregunte...

    La broma es que yo me dedico mas a programar "claro no soy el experto tengo como algo mas de 1 año programando como tal bastante y trabajando en ello" y estoy realizando unos cursos para certificarme como MCPD y en el primer modulo fue de SQL Server 2008 no un nivel tan profundo obviamente  pero mas o menos y ahora tengo que presentar la primera prueba que es el examen 70-432 y me estoy capacitando bien para presentar en 1 mes mas o menos, asi que me estoy viendo una seria de videos de vi de SQL donde te explican todo paso por paso son como 15 videos de 40min y en el numero 6 te hablan de esto y lo explican de maravillas, solo que es en ingles y a pesar de que domine algo el idioma como este es un tema algo complicado no logro captar toda la idea... Es cierto que no me convertire en un experto con ello pero para conocer al menos la idea principal de cada cosa...

    Voy a leer todo lo que me distes y luego te cuento, muchas gracias...

    Sunday, May 23, 2010 8:29 PM
  • Hola.

    Eso son CTEs o common table expressions o expresiones de table comunes. Me gusta explicarlas refiriéndome a ellas como una especie de vistas temporales. Este caso que expones es de los más interesantes, las CTEs recursivas.

    Son muy interesantes porque abren un importante abanico de posibilidades. Aquí tienes la teoría: http://msdn.microsoft.com/es-es/library/ms186243.aspx y aquí un ejemplo práctico de uso: http://qwalgrande.blogspot.es/1255098540/me-gustan-las-ctes-(tabla-de-dias)/

    Estas construcciones requieren de una sintaxis concreta que precisa el uso de algunas palabras reservadas, como ";with". Es importante lo del ";". Como su nombre indica, viene a significar "Con esta consulta, ejecútame esta otra".

    Sobre "Union", necesario para montar la recursividad, es un concepto previo. Sirve para juntar dos conjuntos de registros. Puedes encontrar explicación detallada en los books online: http://msdn.microsoft.com/es-es/library/ms180026.aspx y aquí varios ejemplos: http://msdn.microsoft.com/en-us/library/ms187731.aspx (en la versión en español faltan las consultas).

    Level (para identificar el nivel de aislamiento, set transaction isolation level read uncommitted, por ejemplo) es palabra reservada, pero aquí es usada como alias de un campo. Es decir, de casualidad. Lo puedes sustituir por "nivel" en tu consulta para evitar la confusión.

    Sobre relacionar un campo de una tabla con otro de la misma, el típico ejemplo es el de las tablas que almacenan jerarquías, como por ejemplo una tabla de empleados, que tiene un campo IdEmpleado y un campo IdJefe que informa del superior del empleado y que a su vez es otro registro dentro de la tabla de empleados.

    De todos modos, y con el debido respeto, creo que no es adecuado plantearte el uso de CTEs en este momento, cuando no tienes dominados conceptos mucho más básicos, como las consultas de unión. Está muy bien que seas ambicioso, pero para que realices un progreso más sólido has de ir paso a paso.

    En cualquier caso, no dejes de preguntar, por ejemplo en este foro.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)

    Hola de nuevo, ya pude leer y entender todo... Muchas muchas gracias por la información....
    Wednesday, May 26, 2010 10:09 PM