[VFP] LEFT JOIN me esta duplicando registros

9,671 views
Skip to first unread message

ZeRoberto

unread,
Sep 26, 2012, 11:58:39 AM9/26/12
to publicesvfoxpro
Porque cuando hago un LEFT JOIN me duplica registros, se supone que solo debe tomar los datos de acuerdo a la tabla de la izquierda.
 
Use Costes In 0 Alias dbCostes
Use Columnas In 0 Alias dbColumnas
Select a.*, b.HorarioID, b.CosteID, b.TipoDiaID, b.Desde, b.Hasta, b.Laborable ;
        From dbColumnas a ;
             Left Join dbCostes b On a.ConceptoID = b.ConceptoID  ;
             Where b.HorarioID = 2 Into Cursor dbLista Order By b.Desde
 
 
LeftJoin.PNG
columnas.DBF
costes.dbf
Message has been deleted

ZeRoberto

unread,
Sep 26, 2012, 12:05:27 PM9/26/12
to publice...@googlegroups.com
Es opcional en MySQL tambien lo pongo asi
 
Saludos

El 26 de septiembre de 2012 11:04, Fox Learner <thenewin...@gmail.com> escribió:
El vfp no maneja AS para los alias?..

No debería ser "From dbColumnas AS a ?

Saludos!

--
 
 
 

Message has been deleted

ZeRoberto

unread,
Sep 26, 2012, 12:11:12 PM9/26/12
to publice...@googlegroups.com
Lo he probado con todos los tipos de JOINS y me arroja el mismo resultado.
 
Saludos

El 26 de septiembre de 2012 11:10, Fox Learner <thenewin...@gmail.com> escribió:
Prueba a agregarle la palabra INNER.   Saludos!

--
 
 
 

Message has been deleted

Pablo Daniel Lissa

unread,
Sep 26, 2012, 12:44:57 PM9/26/12
to publice...@googlegroups.com
Según las tablas, para las columnas con columnaid = 1 y columnaid = 4 (ambas con conceptoid = 4) existen dos registros en la tabla costos tales que conceptoid = 4.

Además, hay 2 registros con conceptoid != 4.

Por lo tanto: 2 x 2 + 2 = 6 registros.

Para generalizar un poco el ejemplo, si en la tabla columnas tuvieras 3 registros con conceptoid = N y en la tabla costos tuvieras 6 registro con el mismo conceptoid = N, esto te genera
3 x 6 = 18 coincidencias (registros resultados).

El LEFT JOIN funciona así:
- Si no encuentra coincidencias, mantiene el registro de la tabla izquierda (y pone .Null. en los campos de la tabla derecha).
- Si encuentra coincidencias, cruza el registro de la tabla izquierda con todos los que coinciden en la tabla derecha.

Saludos.
-----------------------------------------------------------------------------------------

ZeRoberto

unread,
Sep 26, 2012, 1:05:39 PM9/26/12
to publice...@googlegroups.com
Gracias Pablo y cual seria la condicion para que no me duplique.
 
Saludos


--
 
 
 

Luis Maria Guayan

unread,
Sep 26, 2012, 1:42:51 PM9/26/12
to publice...@googlegroups.com
El problema lo tienes en las tablas, ya que en ambas tienes repetidos en el campo ConceptoId

Los Joins generalmente se hacen a tablas con valores de campos únicos

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

--
 
 
 

ZeRoberto

unread,
Sep 26, 2012, 3:25:24 PM9/26/12
to publice...@googlegroups.com
Gracias Luis Maria y como le haría para que no se me duplique alguna condición extra?

Saludos


--
 
 
 

Luis Maria Guayan

unread,
Sep 26, 2012, 3:35:59 PM9/26/12
to publice...@googlegroups.com
Como te indiqué, el problema no es el SELECT ni el JOIN, sino es que estas enlazando con campos que en ambas tablas tienes valores duplicados.

Intenta con la clausula DISTINCT del SELECT

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

--
 
 
 

Víctor Hugo Espínola Domínguez

unread,
Sep 26, 2012, 4:14:12 PM9/26/12
to publice...@googlegroups.com
Hola ZeRoberto

Tu tabla Columnas tiene repetido el ConceptoId = 4

Saludos.
Víctor.


 
 

--
 
 
 

Pablo Daniel Lissa

unread,
Sep 26, 2012, 6:17:33 PM9/26/12
to publice...@googlegroups.com
Concuerdo con lo que te comentó Luis María Guayán. Si necesitás 1 registro resultado por cada registro de la tabla izquierda, los campos en la condición del JOIN deberían no repetirse en la tabla derecha (en este caso, hay dos registros con conceptoid = 4).

Si indicás cuáles registros son los que no deberían ir, y el porqué, posiblemente surja alguna idea de como solucionarlo.

Saludos.
------------------------------------------------------------------------------------------------------------------------------------------------------

ZeRoberto

unread,
Sep 26, 2012, 7:43:49 PM9/26/12
to publice...@googlegroups.com
Gracias Victor Hugo creo que al final le voy a tener que hacer manual, pero presiento que voy a llegar al mismo resultado, a menos que los vaya marcando como procesado.
 
Saludos

--
 
 
 

ZeRoberto

unread,
Sep 26, 2012, 7:44:51 PM9/26/12
to publice...@googlegroups.com
Gracias a todos voy a ver como resuelvo esto
 
Saludos


--
 
 
 

Walter R. Ojeda Valiente

unread,
Sep 26, 2012, 7:57:23 PM9/26/12
to publice...@googlegroups.com
Utiliza la cláusula DISTINCT para no obtener duplicados.

Saludos.

Walter.




Date: Wed, 26 Sep 2012 18:43:49 -0500
Subject: Re: [vfp] [VFP] LEFT JOIN me esta duplicando registros
From: zero...@gmail.com
To: publice...@googlegroups.com
--
 
 
 

ZeRoberto

unread,
Sep 26, 2012, 8:01:24 PM9/26/12
to publice...@googlegroups.com
Gracias Walter voy a probarlo!
 
Saludos

--
 
 
 

Pablo Daniel Lissa

unread,
Sep 27, 2012, 8:11:58 AM9/27/12
to publice...@googlegroups.com
Perdón por lo negativo, pero DISTINCT no te va a servir en este caso.

En la imagen que pusiste se ve que los registros que te traen conflicto son 1, 2, 5 y 6. Bien:
- 1 se diferencia de 2 por el campo columnaId;
- 5 de 6, por lo mismo;
- 1 y 2 se difrencian de 5 y 6 por los campos desde y hasta.

DISTINCT te va a devolver lo mismo.

Hay que apuntar a lo que ya dijo Luis María: plantear JOIN sobre campos de tabla que tengan valores no repetidos.

Saludos.
----------------------------------------------------------------------------------------------------------------------------------

ZeRoberto

unread,
Sep 27, 2012, 6:05:31 PM9/27/12
to publice...@googlegroups.com
Si tienes razon no funciona!
 


 
--
 
 
 

Hector R. De los Santos

unread,
Sep 28, 2012, 9:39:20 AM9/28/12
to publice...@googlegroups.com
@Roberto,

Si vas a usar JOINS no puedes tener registros duplicados, JOIN solo trabaja con registros unicos. 
Al parecer tienes un problema de normalizacion o redundacia de datos.
Mientras tengas registros duplicados no podras usar JOIN sin que te devuelva ese tipo de resultados.

Para tu caso te va a tocar filtar los datos de forma manual con cursores.

Suerte!


:: HDS Consultores TI
Servidores | Redes | Programacion | GNU/Linux | PostgreSQL
Web: http://hdsconsultores.net
Blog: http://codigohds.com
Linux User #:320363


--
 
 
 

ZeRoberto

unread,
Sep 28, 2012, 4:20:17 PM9/28/12
to publice...@googlegroups.com
Gracias Hector, tendra que ser manual.

Saludos

El 28/09/12, Hector R. De los Santos <zah...@gmail.com> escribió:
>>>>> ------------------------------
>>>>> Date: Wed, 26 Sep 2012 18:43:49 -0500
>>>>> Subject: Re: [vfp] [VFP] LEFT JOIN me esta duplicando registros
>>>>> From: zero...@gmail.com
>>>>> To: publice...@googlegroups.**com
> --
>
>
>
>

Roberto Pardo López

unread,
Oct 1, 2012, 3:30:16 AM10/1/12
to publice...@googlegroups.com
Métele un Group By <Primary_Key_De_La_Tabla_Izquierda>

Carlos Bianco Vidal Saavedra

unread,
Jun 4, 2014, 5:10:08 PM6/4/14
to publice...@googlegroups.com
Buenas tardes,

Si lo que deseas es que no se repitan las 2 primera y ultimas filas ya unas de tus tablas se repiten el dato entonces utiliza el group by despuesta de tu where

Use Costes In 0 Alias dbCostes
Use Columnas In 0 Alias dbColumnas
Select a.Columnaid,a.Conceptoid,a.Concepto, b.HorarioID, b.CosteID, b.TipoDiaID, b.Desde, b.Hasta, b.Laborable ;

        From dbColumnas a ;
             Left Join dbCostes b On a.ConceptoID = b.ConceptoID  ;
             Where b.HorarioID = 2 
group by a.Columnaid,a.Conceptoid,a.Concepto, b.HorarioID, b.CosteID, b.TipoDiaID, b.Desde, b.Hasta, b.Laborable
Into Cursor dbLista 
--Order By b.Desde
Reply all
Reply to author
Forward
0 new messages