none
consulta en sql RRS feed

  • Pregunta

  • necesito ayuda en esta consulta he intentado hacer pero no doy con la solución

    /*Listar los productos y sus categorías excluyendo a los productos mas caros y mas baratos por categoría*/

    select pr.prod_nombre, pr.prod_precio, ca.cate_nombre
    from Empresa.producto as pr,Empresa.categoria as ca
    where ca.cate_id = pr.cate_id
    and pr.prod_precio<(
    select  max(pr.prod_precio)
    from Empresa.producto as pr,Empresa.categoria as ca
    where pr.cate_id=ca.cate_id 
    )
    and
    pr.prod_precio>(
    select min(pr.prod_precio)
    from Empresa.producto as pr,Empresa.categoria as ca
    where pr.cate_id=ca.cate_id 

    )

    jueves, 1 de octubre de 2020 18:12

Todas las respuestas

  • Hola andrey_09_andy:

    Cambia la sintaxis de la query y las relaciones indícalas en on y no en  where.

    Luego cambias las subconsultas, para que los alias no sean los mismos que los alias de las tablas exteriores, y en el where indica la relación con las mismas

    create table producto (cate_id int, prod_nombre varchar(10), prod_precio int)
    create table categoria (cate_id int, cate_nombre varchar(10));
    go
    
    insert into categoria (cate_id, cate_nombre)
    values
    (1,'a'),
    (2,'b');
    
    insert into producto (cate_id, prod_nombre, prod_precio)
    values
    (1,'prodA',10), -- menor
    (1,'prodB',10), -- menor
    (1,'prodC',25),
    (1,'prodD',20),
    (1,'prodE',30), -- mayor
    (2,'prodF',10), -- menor
    (2,'prodG',90), -- mayor
    (2,'prodH',80),
    (2,'prodI',90), -- mayor
    (2,'prodJ',25);
    go

    Un ejemplo con lo que has puesto.

    select pr.prod_nombre
    	 , pr.prod_precio
    	 , ca.cate_nombre
    	   from producto as pr
    		inner join categoria as ca on ca.cate_id = pr.cate_id 
    		where
    			 pr.prod_precio<(
    							select  max(pr2.prod_precio)
    										   from producto as pr2 
    												inner join  categoria as ca2 on pr2.cate_id = ca2.cate_id
    												where pr2.cate_id = pr.cate_id
    												and ca2.cate_id = ca.cate_id
    									group by pr2.cate_id, ca2.cate_id
    								  )
    			and pr.prod_precio > (
    									select min(pr3.prod_precio)
    									  from producto as pr3 
    											inner join categoria as ca3 on pr3.cate_id = ca3.cate_id
    									  where pr3.cate_id = pr.cate_id
    											and ca3.cate_id = ca.cate_id
    									  group by pr3.cate_id, ca3.cate_id
    									  
    							 );

    Resultado:

    jueves, 1 de octubre de 2020 19:39
  • Hola javi Fernadez 

    muchísimas gracias .

    jueves, 1 de octubre de 2020 20:45
  • Buen día.

    Javi ayúdame a entender. 

    Las subconsultas para obtener el máximo y mínimo se ejecutan cada vez por registro o como Sql Server ejecutaría esta consulta?

    Saludos.

    Mauricio

    sábado, 3 de octubre de 2020 13:13
  • Hola Mauricio Pulla:

    No se ejecutan cada vez por registro. En realidad el motor lo trata como conjuntos independientes.

    Por un lado hace la query del conjunto "pr2" completa.

    Por otro lado hace la query del conjunto "pr3" completa.

    Luego une estos dos conjuntos.

    Luego lee categorías y lo mezcla con los dos conjuntos anteriores.

    Luego lee productos, y los mezcla con el resultado de las uniones anteriore.

    Ahora bien, TSql es un lenguaje declarativo, por tanto nosotros le decimos lo que queremos y es el motor el que decide como lo ejecuta. Para eso disponemos de los planes de ejecución, donde nos esnseña como lo hace. 

    El plan de ejecución que te muestro, corresponde al ejemplo. Es muy posible que si hubiera x millones de filas en alguna de las tablas, se ejecutase de otro modo.

    Existen varias maneras de ver los planes de ejecución, y también depende de la herramienta.

    Si utilizas SQL Server Management Studio

    Luego ejecutas la query y en la ventana de salida te muestra el resultado.

    El plan de ejecución visual, no es el que más datos y precisión ofrece. Pero es suficiente para ver como se ejecutan.

    Normalmente TSql aunque tu pongas una consulta "mala" para que se ejecute fila por fila, el directamente va a utilizar operadores de conjuntos, para resolver lo antes posible.

    A veces hay cosas que no puede resolver, como poner una select en una columna y entonces es donde ejecuta lo que indicas.

    Espero te haya servido un poco para comprender como lo hace.

    Esto de los planes de ejecución es todo un mundo

    Planes de ejecución

    https://docs.microsoft.com/es-es/sql/relational-databases/performance/execution-plans?view=sql-server-ver15

    domingo, 4 de octubre de 2020 6:58
  • Hola Javi.

    Gracias por la explicación, me sirvió bastante

    Saludos.

    Mauricio

     

    miércoles, 7 de octubre de 2020 3:48