SQL - Consulta sobre distinct

 
Vista:

Consulta sobre distinct

Publicado por Jonathan (1 intervención) el 28/12/2016 06:51:35
Alguien podria quitarme la duda de cuando utilizar DISTINCT ya que he realizado un ejercicio mediante una consulta el cual el resultado es correcto , pero la base de datos la genera como incorrecta internamente
la consulta fue esta:

SELECT PRODUCT.TYPE,LAPTOP.MODEL,LAPTOP.SPEED
FROM PRODUCT JOIN LAPTOP ON PRODUCT.MODEL=LAPTOP.MODEL
WHERE LAPTOP.SPEED<(SELECT MIN(SPEED) FROM PC)


Y cuando coloco DISTINCT la bd la interpreta como completamente correcta

SELECT DISTINCT PRODUCT.TYPE,LAPTOP.MODEL,LAPTOP.SPEED
FROM PRODUCT JOIN LAPTOP ON PRODUCT.MODEL=LAPTOP.MODEL
WHERE LAPTOP.SPEED<(SELECT MIN(SPEED) FROM PC)


Entonces cuando se que debo colocar DISTINCT?
El enunciado fue el siguiente:

Get the laptop models that have a speed smaller than the speed of any PC.
Result set: type, model, speed


y la base de datos es esta:

Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, screen, price)
Printer(code, model, color, type, price)

The Product table contains data on the maker, model number, and type of product ('PC', 'Laptop', or 'Printer'). It is assumed that model numbers in the Product table are unique for all makers and product types. Each personal computer in the PC table is unambiguously identified by a unique code, and is additionally characterized by its model (foreign key referring to the Product table), processor speed (in MHz) – speed field, RAM capacity (in Mb) - ram, hard disk drive capacity (in Gb) – hd, CD-ROM speed (e.g, '4x') - cd, and its price. The Laptop table is similar to the PC table, except that instead of the CD-ROM speed, it contains the screen size (in inches) – screen. For each printer model in the Printer table, its output type (‘y’ for color and ‘n’ for monochrome) – color field, printing technology ('Laser', 'Jet', or 'Matrix') – type, and price are specified.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Manuel
Val: 58
Ha disminuido 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Consulta sobre distinct

Publicado por Manuel (20 intervenciones) el 28/12/2016 12:58:01
Lo primero: Pocas veces usar DISTINCT es la mejor opción, es más lenta, requiere más recursos, etc... Incluso muchos SGBD no la tienen, por ejemplo Access hasta la versión 2007 no la tenía. Prácticamente no hace falta ya que suele ser mejor idea GROUP BY, incluso en algunos casos que GROUP BY no sirviera, pues una subconsulta para filtrar.

Lo segundo es que te felicito, porque has echo la pregunta muy bien, me gustaría que hubieses puesto que SGBD está usando y tal, pero está muy bien, así da gusto contestar, que ha veces ni sabes lo que preguntan.

Entrando en tema sobre cuando se utiliza DISTINCT.

En cuanto a esa pregunta, pues vuelvo a algo comentado en el primer párrafo: depende del SGBD puede haber diferencias, por ejemplo yo te diré para un Access actual... En Access si en la consulta hay para recuperar más de un campo (como en la que tu pones) pues DISTINCT buscara las combinaciones de todos ellos que sean distintas, en cristiano, no se aplica sobre un solo campo, como supongo que tu pretendías... para eso habría que usar GROUP BY (y puede que Having).

En cuanto a la pregunta 2, pues si lo entiendo bien, en castellano sería: Devuelve todos los portátiles (LAPTOP) cuya velocidad (SPEED) que la del PC más lento (que creo que la intención real), aunque pone de cualquier PC realmente, lo que no es lo mismo, ya que en el segundo caso, sería mirar todos los que tengan una velocidad más baja que el PC de velocidad más alta (algo que no creo). Y por tanto hay 2 posibles consultas. Y debe devolver los campos Type, Speed y Model. Aunque no tengo info suficiente por si quieres de la tabla product o de Laptop. Después hay varias formas de sacar la velocidad del PC más lento, se puede usar MIN o coger solo el registro primero ordenando por velocidad ascendente... parece una tontería, pero si tienes miles de registros, se hacen miles de consultas, etc... pues la segunda forma requiere menos recursos de la máquina, es más rápida, etc.

Por tanto una solución podría ser:

SELECT Laptop.Type, Laptop.Speed, Laptop.Model From Laptop Where Laptop.Speed < (select top PC.Speed from PC order by PC.Speed ASC)

Pero habría que saber si puede haber varios Laptops del mismo modelo y distinta velocidad, etc...

hasta luego
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Manuel
Val: 58
Ha disminuido 1 puesto en SQL (en relación al último mes)
Gráfica de SQL

Consulta sobre distinct

Publicado por Manuel (20 intervenciones) el 29/12/2016 14:13:48
tengo un pequeño error en la consula, final, falta poner un 1 después de top (select top 1 PC.Speed...), así garantizas que se devuelva solo 1 registro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar