Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-03-2010
Avatar de Softweb
Softweb Softweb is offline
Miembro
 
Registrado: ago 2008
Posts: 46
Poder: 0
Softweb Va por buen camino
JOIN duplicados

Hola

Tengo una consulta en SQL Server que no consigo que me salga sin duplicados, es de una base de datos de libros (ARTICULOS) que la enlaso con otra que contiene códigos de los autores del libro (TITULO_AUTOR) y a la vez con otra que contiene el nombre de los autores (AUTORES).

El problema es que si un libro tiene varios autores, me sale una linea del mismo articulo por cada autor que tenga, cuando solo quiero que muestre el primero que encuentre.

Una versión reducida de la sentencia es esta.

Código SQL [-]
SELECT distinct A.CODIGO, A.NOMBRE_ARTICULO, A.CODIGO_EAN, U.AUTORES_NOMBRE
FROM dbo.ARTICULOS A
 LEFT JOIN dbo.TITULO_AUTOR T ON A.CODIGO=T.TITULOS_CODIGO
INNER JOIN dbo.AUTORES U ON T.AUTORES_CODIGO=U.AUTORES_CODIGO

E probado en los JOIN con LEFT, RIGHT y con INNER.



Saludos
Responder Con Cita
  #2  
Antiguo 23-03-2010
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
En ese caso, deberías recuperar el valor mínimo del campo U.AUTORES_NOMBRE

Prueba con esta select, a ver que te muestra.

Código SQL [-]
SELECT distinct A.CODIGO, A.NOMBRE_ARTICULO, A.CODIGO_EAN, min(U.AUTORES_NOMBRE)
FROM dbo.ARTICULOS A
 LEFT JOIN dbo.TITULO_AUTOR T ON A.CODIGO=T.TITULOS_CODIGO
INNER JOIN dbo.AUTORES U ON T.AUTORES_CODIGO=U.AUTORES_CODIGO
GROUP BY A.CODIGO, A.NOMBRE_ARTICULO, A.CODIGO_EAN
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...
Responder Con Cita
  #3  
Antiguo 25-03-2010
Avatar de Softweb
Softweb Softweb is offline
Miembro
 
Registrado: ago 2008
Posts: 46
Poder: 0
Softweb Va por buen camino
Cita:
Empezado por defcon1_es Ver Mensaje
En ese caso, deberías recuperar el valor mínimo del campo U.AUTORES_NOMBRE

Prueba con esta select, a ver que te muestra.

Código SQL [-]SELECT distinct A.CODIGO, A.NOMBRE_ARTICULO, A.CODIGO_EAN, min(U.AUTORES_NOMBRE) FROM dbo.ARTICULOS A LEFT JOIN dbo.TITULO_AUTOR T ON A.CODIGO=T.TITULOS_CODIGO INNER JOIN dbo.AUTORES U ON T.AUTORES_CODIGO=U.AUTORES_CODIGO GROUP BY A.CODIGO, A.NOMBRE_ARTICULO, A.CODIGO_EAN
Gracias defcon1_es pero no me es valido ya que la consulta es mas grande y complicada, yo la simplifique para que se entendiera mejor la pregunta.

La consulta real es esta.

Código SQL [-]
SELECT distinct A.ARTICULOS_REFERENCIA_PROVEEDOR, A.ARTICULOS_NOMBRE_ARTICULO, ARTICULOS_CODIGO_EAN, 
U.AUTORES_NOMBRE), A.ARTICULOS_FECHA_CREACION, A.ARTICULOS_PRECIO_VENTA_CON_IVA, A.ARTICULOS_SITUACION, 
A.ARTICULOS_CODIGO, P.PROVEE_NOMBRE, S.ARTICULOS_EXIS_INI_FIRME, E.EDITORIALES_NOMBRE_CORTO, 
S.ARTICULOS_EXIS_INI_DEPOSITO, S.ARTICULOS_EXIS_ACT_FIRME, S.ARTICULOS_EXIS_ACT_DEPOSITO, 
S.ARTICULOS_UNIDAD_PEND_RECIBIR, S.ARTICULOS_UNIDAD_PEND_SERVIR, S.ARTICULOS_UNIDAD_EXAMEN, 
FF.FAMILIAS_DENOMINACION AS Seccion, M.MATERIAS_DENOMINACION AS Materia, ARTICULOS_SITUACION AS ESTADO, E.EDITORIALES_CODIGO
  FROM dbo.ARTICULOS A
  INNER JOIN dbo.ALMACEN_STOCK S ON A.ARTICULOS_CODIGO=S.ARTICULOS_CODIGO 
     Format('AND S.COMPANIA_CODIGO=%d AND S.CENTRO_CODIGO=%d',[BBO_COMPANIA_CODIGO,V_CENTRO])
 INNER JOIN dbo.TITULOS TI ON A.ARTICULOS_CODIGO = TI.TITULOS_CODIGO'
  LEFT JOIN dbo.EDITORIALES E ON TI.TITULOS_EDITORIAL_CODIGO = E.EDITORIALES_CODIGO
  LEFT JOIN dbo.TITULO_AUTOR T ON A.ARTICULOS_CODIGO=T.TITULO_AUTOR_TITULOS_CODIGO
  INNER JOIN dbo.AUTORES U ON T.TITULO_AUTOR_AUTORES_CODIGO=U.AUTORES_CODIGO

  FULL JOIN dbo.FAMILIAS FF ON (FF.FAMILIAS_CODIGO=A.ARTICULOS_FAMILIA AND
  FF.FAMILIAS_TIPO_ARTICULO = A.ARTICULOS_TIPO_ARTICULO)
  FULL JOIN dbo.TITULOS_MATERIAS X ON X.TITMAT_TITULOS_CODIGO=A.ARTICULOS_CODIGO
  FULL JOIN dbo.MATERIAS M ON M.MATERIAS_CODIGO=X.TITMAT_MATERIAS_CODIGO
  FULL JOIN dbo.PROVEEDORES P ON A.ARTICULOS_CODIGO_ULT_PROVEEDOR=P.PROVEE_CODIGO
 ORDER BY A.ARTICULOS_REFERENCIA_PROVEEDOR, A.ARTICULOS_NOMBRE_ARTICULO, ARTICULOS_CODIGO_EAN, 
  U.AUTORES_NOMBRE, A.ARTICULOS_FECHA_CREACION, A.ARTICULOS_PRECIO_VENTA_CON_IVA, 
  A.ARTICULOS_CODIGO, P.PROVEE_NOMBRE, S.ARTICULOS_EXIS_INI_FIRME, 
  S.ARTICULOS_EXIS_INI_DEPOSITO, S.ARTICULOS_EXIS_ACT_FIRME, S.ARTICULOS_EXIS_ACT_DEPOSITO, 
  S.ARTICULOS_UNIDAD_PEND_RECIBIR, S.ARTICULOS_UNIDAD_PEND_SERVIR, S.ARTICULOS_UNIDAD_EXAMEN, 
  FF.FAMILIAS_DENOMINACION, M.MATERIAS_DENOMINACION, ARTICULOS_SITUACION

La consulta es de un listado de libros de una librería.


Gracias y saludos
Responder Con Cita
  #4  
Antiguo 26-03-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola SoftWeb, no he mirado la ultima consulta que has puesto, sobre la primera, tu consulta debería ser mas o menos así:

Código SQL [-]
SELECT A.CODIGO, A.NOMBRE_ARTICULO, A.CODIGO_EAN, U.AUTORES_NOMBRE
FROM ARTICULOS A
INNER JOIN (SELECT Min(AUTORES_CODIGO) as AUTORES_CODIGO, TITULOS_CODIGO
           FROM TITULO_AUTOR GROUP BY TITULOS_CODIGO) T ON A.CODIGO=T.TITULOS_CODIGO
INNER JOIN AUTORES U ON T.AUTORES_CODIGO=U.AUTORES_CODIGO

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #5  
Antiguo 27-03-2010
Avatar de Softweb
Softweb Softweb is offline
Miembro
 
Registrado: ago 2008
Posts: 46
Poder: 0
Softweb Va por buen camino
Muchas gracias por la respuesta, me a sorprendido pues no sabia que se podian poner los JOIN tan enrevesados.;-)

Aunque cuando lo implemento me da un error.

"El prefijo de la columna T no coincide con un nombre de tabla o con un alias usado en la consulta."

Tu codigo despues de ponerle los nombres reales de los campos lo e puesto asin.

Código SQL [-]
 INNER JOIN (SELECT Min(U.AUTORES_CODIGO) as AUTORES_CODIGO, T.TITULO_AUTOR_TITULOS_CODIGO
           FROM dbo.TITULO_AUTOR GROUP BY T.TITULO_AUTOR_TITULOS_CODIGO) T ON A.ARTICULOS_CODIGO=T.TITULO_AUTOR_TITULOS_CODIGO 
   INNER JOIN dbo.AUTORES U ON T.TITULO_AUTOR_AUTORES_CODIGO=U.AUTORES_CODIGO

Parese que es en el tramo
Código SQL [-]
FROM dbo.TITULO_AUTOR GROUP BY T.TITULO_AUTOR_TITULOS_CODIGO) T ON  A.ARTICULOS_CODIGO=T.TITULO_AUTOR_TITULOS_CODIGO

yo lo e cambiado por probar por
Código SQL [-]
FROM dbo.TITULO_AUTOR T GROUP BY T.TITULO_AUTOR_TITULOS_CODIGO) ON  A.ARTICULOS_CODIGO=T.TITULO_AUTOR_TITULOS_CODIGO

pero entonce me dice que hay un error cerca del "ON".

tienes idea de que va el asunto.

Saludos y gracias anticipadas.
Responder Con Cita
  #6  
Antiguo 29-03-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola SoftWeb, no he podido responderte antes porque despues de enviarte mi respuesta no me volvi a conectar al foro hasta hoy día.

Sobre tu pregunta, el error es porque no le estas dando un alias a tu tabla dbo.titulo_autor dentro la subconsulta, la que tiene el alias T es la subconsulta que esta dentro de los paréntesis.

Código SQL [-]
INNER JOIN (SELECT Min(AUTORES_CODIGO) as AUTORES_CODIGO, TITULOS_CODIGO
           FROM TITULO_AUTOR GROUP BY TITULOS_CODIGO) T ON A.CODIGO=T.TITULOS_CODIGO

Otro error es que estas utilizando el Alias U dentro de la subconsulta que tampoco existe, sino que esta fuera en el otro inner join

Cita:
Empezado por Softweb Ver Mensaje
Código SQL [-]

INNER JOIN (SELECT Min(U.AUTORES_CODIGO) as AUTORES_CODIGO, T.TITULO_AUTOR_TITULOS_CODIGO
FROM dbo.TITULO_AUTOR GROUP BY T.TITULO_AUTOR_TITULOS_CODIGO) T ON A.ARTICULOS_CODIGO=T.TITULO_AUTOR_TITULOS_CODIGO
INNER JOIN dbo.AUTORES U ON T.TITULO_AUTOR_AUTORES_CODIGO=U.AUTORES_CODIGO

No te olvides que el campo U.AUTORES_CODIGO osea solo AUTORES_CODIGO debe pertenecer a tu tabla TITULO_AUTOR que en si es el campo que se relaciona con tu tabla AUTORES. Tu consulta debería quedar así:

Código SQL [-]
SELECT A.CODIGO, A.NOMBRE_ARTICULO, A.CODIGO_EAN, U.AUTORES_NOMBRE
FROM dbo.ARTICULOS A
INNER JOIN (SELECT Min(TITULO_AUTOR_AUTORES_CODIGO) as TITULO_AUTOR_AUTORES_CODIGO, TITULO_AUTOR_TITULOS_CODIGO
           FROM dbo.TITULO_AUTOR GROUP BY TITULO_AUTOR_TITULOS_CODIGO) T ON A.ARTICULOS_CODIGO=T.TITULO_AUTOR_TITULOS_CODIGO 
   INNER JOIN dbo.AUTORES U ON T.TITULO_AUTOR_AUTORES_CODIGO=U.AUTORES_CODIGO

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #7  
Antiguo 30-03-2010
Avatar de Softweb
Softweb Softweb is offline
Miembro
 
Registrado: ago 2008
Posts: 46
Poder: 0
Softweb Va por buen camino
Muchas gracias Caro

De tanto mirar el código no veía lo mas elemental, me estoy asiendo viejo y se me despistan la neuronas.

Funciona perfectamente, eres un maestro del SQL.

Saludos y gracias.
Responder Con Cita
  #8  
Antiguo 30-03-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
Empezado por Softweb Ver Mensaje

... eres un maestro del SQL.
Je,je,je
Solo aclarar que Caro es mujer y no hombre.

Amiga Caro quizás deberías modificar la palabra "Moderador" por "Moderadora"..
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #9  
Antiguo 01-04-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por rgstuamigo Ver Mensaje
..................
Amiga Caro quizás deberías modificar la palabra "Moderador" por "Moderadora"..


Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #10  
Antiguo 02-04-2010
Avatar de Softweb
Softweb Softweb is offline
Miembro
 
Registrado: ago 2008
Posts: 46
Poder: 0
Softweb Va por buen camino
Hola

Pues si que es un detalle que no vi , de todas forma hombre o mujer sigo diciendo lo mismo, que eres una maestra y teniendo en cuenta el mundo machista de la programación mucho mas.

Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
usando LEFT JOIN o RIGHT JOIN alcides SQL 8 03-05-2007 17:35:46
left join e inner join duda Patricio SQL 0 26-04-2007 22:06:43
Duplicados con LEFT OUTER JOIN Cabanyaler MS SQL Server 11 17-11-2005 08:46:23
LEFT INNER JOIN & RIGHT INNER JOIN Cabanyaler MS SQL Server 11 07-11-2005 18:09:58
LEFT OUTER JOIN e INNER JOIN Juntos alcides SQL 3 08-07-2005 18:06:27


La franja horaria es GMT +2. Ahora son las 20:50:43.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi