Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   JOIN duplicados (https://www.clubdelphi.com/foros/showthread.php?t=66967)

Softweb 22-03-2010 17:50:07

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

defcon1_es 23-03-2010 13:34:47

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

Softweb 25-03-2010 11:33:03

Cita:

Empezado por defcon1_es (Mensaje 357898)
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

Caro 26-03-2010 20:12:00

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

Softweb 27-03-2010 01:29:51

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.

Caro 29-03-2010 18:32:20

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 (Mensaje 358572)
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

Softweb 30-03-2010 01:52:58

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.

rgstuamigo 30-03-2010 23:12:30

Cita:

Empezado por Softweb (Mensaje 358773)

... eres un maestro del SQL.

Je,je,je:D
Solo aclarar que Caro es mujer y no hombre.;) :D

Amiga Caro quizás :rolleyes: deberías modificar la palabra "Moderador" por "Moderadora".;):D.
Saludos...:)

Caro 01-04-2010 18:08:55

Cita:

Empezado por rgstuamigo (Mensaje 358879)
..................
Amiga Caro quizás :rolleyes: deberías modificar la palabra "Moderador" por "Moderadora".;):D.

;)

Saluditos

Softweb 02-04-2010 00:12:40

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.


La franja horaria es GMT +2. Ahora son las 02:46:05.

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