none
Consultas anidadas en SQL Server y Oracle RRS feed

  • Pregunta

  • Hola a todos, estoy haciendo una aplicación que partiendo de una tabla de Provincias, mediante una sola consulta utilizando Joins entre varias tablas me devuelva los datos principales de la tabla provincias y alguna estructura de datos con la colección de existen de la provincia seleccionada en las otras tablas.

    por ejemplo el cliente selecciona una provincia y le aparecen en la pantalla datos de la provincia tales como la población, extensión, comunidad a la que pertenece y colecciones de actividades tales como Museos, Teatros, etc, pero sin necesidad de hacer varias consultas

          la query debe devolver:

    - Nombre de la provincia

    - Comunidad

    - Habitantes

    - Lista de Teatros

    - Lista de Cines

    - Lista de Museos

    pero no se si en SQL Server u Oracle existe alguna estructura de datos y alguna forma de programar la consulta o subconsultas para devolver todo en una sola consulta.

    un saludo y gracias

    lunes, 17 de abril de 2017 18:38

Respuestas

  • finalmente utilicé Oracle y la función  XMLAGG (XMLELEMENT (e, CODE, ',').EXTRACT ('//text()')),   ',')

    esta función hace que cuando una consulta devuelve varios valores para el campo que quieres consultar, y para el que quieres una sola fila, lo que hace es crear una variable con los distintos valores separados por comas, por ejemplo si consultas los cines que pasan una determinada película a través de la variable NOMCINE el valor que retorna es "Cine Callao, Cine Ideal, Cine CondeDuque, ...

    un saludo

     

    • Marcado como respuesta fjjcent miércoles, 3 de mayo de 2017 19:21
    miércoles, 3 de mayo de 2017 19:21

Todas las respuestas

  • Eso dependera de como tienes el esquema de esa db.

    Si la lista de teatros, cines y museos esta estan en la misma tabla, entonces puedes crear un query que devuelva lo sgte:

    - opcion 1: dos conjuntos de resultados, el uno para los atributos de la provincia y el otro para la coleccion

    select col1,...,coln from provincia where provincia_id = @provincia_id;
    select pa.col1,...,pa.coln
    from provincia as p inner join provincia_atracciones as pa on pa.provincia_id = p.provincia_id
    where p.provincia_ids = @provincia_id and pa.atraccion_tipo in ('cine', 'teatro', 'museo');

    - opcion 2: un unico resultado para la coleccion y repetir atributos de la provincia

    select p.col1,...,p.coln,pa.col1 as pa_col1,...,pa.coln as pa_coln
    from provincia as p inner join provincia_atracciones as pa on pa.provincia_id = p.provincia_id
    where provincia_id = @provincia_id and pa.atraccion_tipo in ('cine', 'teatro', 'museo');

    - Componer un documento XML en el lado del servidor de SQL y descomponer este en tu aplicacion


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 17 de abril de 2017 19:37
  • ...Estoy haciendo una aplicación que partiendo de una tabla de Provincias, mediante una sola consulta utilizando Joins entre varias tablas me devuelva los datos principales de la tabla provincias y alguna estructura de datos con la colección de existen de la provincia seleccionada en las otras tablas.

    Por ejemplo el cliente selecciona una provincia y le aparecen en la pantalla datos de la provincia tales como la población, extensión, comunidad a la que pertenece y colecciones de actividades tales como Museos, Teatros, etc, pero sin necesidad de hacer varias consultas

    Bajo lo que nos comentas yo sólo veo una consulta de selección simple con las combinatorias correspondientes (join), del conjunto de datos recuperado debes rellenar una estructura en memoria bajo la forma que deseas, por ejemplo:

    public class Teatros
    {
    	public int idTeatro { get; set; }
    	public string Teatro { get; set; }
    }
    
    public class Cines
    {
    	public int idCine { get; set; }
    	public string Cine { get; set; }
    }
    
    public class Provincia
    {
    	public string Nombre { get; set; }
    	public int Habitantes { get; set; }
    	public List<Teatros> Teatros { get; set; }
    	public List<Cines> Cines { get; set; }
    }
    

    Finalmente, por la sección en la que escribes el hilo entiendo que accedes a los datos mediante ADO .Net, todo lo mencionado es simple si optas por usar algún ORM -por ejemplo Entity Framework- dado que las tablas están mapeadas en clases y recuperar la información es simple mediante propiedades de asociación.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 17 de abril de 2017 20:02
  • No especifiqué que la provincia es una tabla, los cines otra, los museos otra y los teatros otra, y entiendo que si lo hago a través de JOIN algo como 

    SELECT * FROM PROVINCIAS A

    LEFT JOIN TEATROS B

    ON A.PROV_OD = B.PROVID

    entonces si existen tres teatros lo que voy a obtener es tres registros en los que los datos de las provincias están repetidos, y yo la salida que busco es un solo registro en el que aparecen solo una vez los datos de la provincia y algún tipo de dato que me devuelve los tres teatros como una colección, tengo mis dudas de si ese tipo de dato para los teatros existe en SQL Server lo veo más probable en Oracle.

    corrígeme si estoy equivocado.

    gracias 

    lunes, 17 de abril de 2017 21:02
  • Si si utilizo ADO 4 y Code First no creo que fuera muy difícil, pero el problema es que no me dejan usar ADO 4 solo el ADO 2, de ahi mi consulta dado que lo que tiene que devolver las colecciones es una consulta SQL y eso es lo que busco, la idea es que la query devuelva unos datos como los que indicas en provincias pero con una consulta SQL.

    gracias

    lunes, 17 de abril de 2017 21:06
  • Si si utilizo ADO 4 y Code First no creo que fuera muy difícil, pero el problema es que no me dejan usar ADO 4 solo el ADO 2, de ahi mi consulta dado que lo que tiene que devolver las colecciones es una consulta SQL y eso es lo que busco, la idea es que la query devuelva unos datos como los que indicas en provincias pero con una consulta SQL.

    Creo que no nos estamos entendiendo. En caso el gestor de base de datos permita retornar los datos bajo una estructura jerárquica ¿que estructura utilizarías en tu aplicación para contener los resultados?. Lo primero que tienes que implementar es una estructura para contener los datos en memoria, recuperas los datos de la base de datos y mapeas cada valor de columna a su respectiva propiedad, claro, la consulta de selección retornará una "estructura denormalizada" pero es en el mapeo donde "aplastas" los valores en datos individuales y colecciones. Mencionas que has trabajado con el enfoque CODE FIRST, por tanto entiendo que conoces de Linq To Entities, no deberías tener problemas en mapear los resultados a una estructura jerárquica.

    Hazme saber si entendiste lo que propongo.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 17 de abril de 2017 22:57
  • finalmente utilicé Oracle y la función  XMLAGG (XMLELEMENT (e, CODE, ',').EXTRACT ('//text()')),   ',')

    esta función hace que cuando una consulta devuelve varios valores para el campo que quieres consultar, y para el que quieres una sola fila, lo que hace es crear una variable con los distintos valores separados por comas, por ejemplo si consultas los cines que pasan una determinada película a través de la variable NOMCINE el valor que retorna es "Cine Callao, Cine Ideal, Cine CondeDuque, ...

    un saludo

     

    • Marcado como respuesta fjjcent miércoles, 3 de mayo de 2017 19:21
    miércoles, 3 de mayo de 2017 19:21