Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Duda con Distinct en Oracle

Estas en el tema de Duda con Distinct en Oracle en el foro de Bases de Datos General en Foros del Web. Llevo desde ayer intentando sacar una SELECT en condiciones para el curro. A ver si sois capaces de ayudarme. Tablas: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver ...
  #1 (permalink)  
Antiguo 30/08/2017, 05:06
 
Fecha de Ingreso: diciembre-2008
Mensajes: 4
Antigüedad: 15 años, 11 meses
Puntos: 0
Duda con Distinct en Oracle

Llevo desde ayer intentando sacar una SELECT en condiciones para el curro. A ver si sois capaces de ayudarme.

Tablas:

Código SQL:
Ver original
  1. direcciones
  2. -----------
  3.  
  4. ID NUMBER
  5. TIPO_Direccion NUMBER
  6. id_persona NUMBER
  7. direccion VARCHAR2(50)
  8.  
  9. personas
---------
id NUMBER
nombre VARCHAR2(50)


El caso es que relaciono las tablas así
Código SQL:
Ver original
  1. SELECT per.id AS id_persona
  2. , per.nombre
  3. , dir.id AS id_direccion
  4. , dir.tipo_direccion
  5. , dir.direccion
  6. FROM personas per
  7. JOIN direcciones dir ON per.id = dir.id_persona
  8. ;


El tipo de direccion puede ser:
- nacional := 0
- principal := 1
- segunda casa := 2

Cada persona puede tener sólo una "nacional" o "principal" y diferentes "segunda casa".



Me piden que aparezca en ése orden y sólo de una persona. El problema es que no consigo hacer funcionar "distinct".


Alguna ayuda de experto? Todo debe ser en una View montada, no me valen funciones aunque pueden ser llamadas.


Muchas gracias!!

Última edición por gnzsoloyo; 30/08/2017 a las 12:53
  #2 (permalink)  
Antiguo 30/08/2017, 07:40
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Duda con Distinct en Oracle

Un ejemplo de tus datos, y cual es la salida esperada ayudaria un poco mas
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 30/08/2017, 12:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Duda con Distinct en Oracle

La consulta que nos muestras funge de INNER JOIN, te va a mostrar TODO el resultado del join, y el DISTINCT no va a hacer diferencias porque opera sobre los resultados, haciendo que no se repitan registros donde todos y cada uno de los valores en cada campo sean iguales entre dos registros cualesquiera.
Pero la query que pones no tendría repeticiones, ni aun cuando se tratase de una persona con diferentes casas... porque cada casa es diferente a la otra.
¿Se entiende?
Lo que necesitas no es simplemente hacer un DISTINCT, sino un GROUP BY con una condición de WHERE adecuado a tu caso.

Postea como te dice Libras, datos de ejemplo de ambas tablas y veremos como se puede hacer.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 31/08/2017, 01:38
 
Fecha de Ingreso: diciembre-2008
Mensajes: 4
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Duda con Distinct en Oracle

Al final lo he solucionado de la siguiente manera:


Código:
SELECT  id_persona, 
        per.nombre, 
        id_direccion, 
        dir.tipo_direccion, 
        dir.direccion
FROM (  SELECT  per.id AS id_persona, 
                per.nombre, 
                dir.id AS id_direccion, 
                dir.tipo_direccion, 
                dir.direccion,
                ROW_NUMBER() OVER(PARTITION BY per.id ORDER BY dir.tipo_direccion)  AS rn
        FROM personas per
        INNER JOIN direcciones dir 
            ON per.id = dir.id_persona) AS t
WHERE t.rn = 1;

No podía usar GROUP BY ya que es en Oracle, no en MySQL. Y no funciona igual

Etiquetas: distinct, oracle, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:18.