update runsql run ejemplos ejecutar docmd consultas consulta sql ms-access access-vba

runsql - Deduplicación por dos columnas



select sql access vba (4)

Es posible en sql. Escribí el código sql. Supongo que tienes una columna de identificación en la tabla y tu nombre de tabla es personas . Escribí el código para actualizar la columna '' corregir ''. El truco es unir la mesa consigo mismo. Si usted tiene alguna pregunta no dude en preguntar.

update temp1 set temp1.fix='''' from people temp1 inner join people temp2 on temp1.fix=temp2.fix where temp1.id>temp2.id

1Es necesario deduplicar una tabla como esta: -

name | fix | mobile -----+-----+--------- dan | 1 | 1 jon | 1 | 3 mia | 1 | 4 ken | 5 | 4

Quiero tener:-

dan | 1 | 1 jon | | 3 mia | | 4 ken | 5 |

Es posible con Excel, pero para 500k filas obtengo ''not responding'' Access elimina toda la línea si encuentra un duplicado.

ex: establece la clave principal en la corrección, obtengo: -

dan | 1 | 2 ken | 5 | 4

establecer la clave principal en mobil , obtengo:

dan | 1 | 1 jon | 1 | 3 mia | 1 | 4

¿Puede SQL u otro programa hacer esto? He intentado usar distinct o group by, pero no encontré la fórmula correcta.


Este módulo debería hacer el trabajo. He usado una copia de tu tabla original (aquí la he llamado tabla1) llamada dedup

Public Function Dedup() Dim rstSource As DAO.Recordset Dim rstDestination As DAO.Recordset Dim deduppreviousValue As Long Dim dedupValue As Long Dim blnInit As Boolean Set rstSource = CurrentDb.OpenRecordset("Select * from Table1 order by Fix,Mobile") Set rstDestination = CurrentDb.OpenRecordset("dedup") With rstSource .MoveFirst blnInit = False While Not .EOF dedupValue = .Fields("fix") rstDestination.AddNew rstDestination.Fields("NameID") = .Fields("nameID") If Not blnInit Then rstDestination.Fields("fix") = .Fields("fix") blnInit = True Else If deduppreviousValue <> dedupValue Then rstDestination.Fields("fix") = .Fields("fix") Else End If End If rstDestination.Fields("mobile") = .Fields("mobile") rstDestination.Update deduppreviousValue = .Fields("fix") .MoveNext Wend End With End Function


Use esta consulta:

SELECT t.NAME, IIF(t.partRankFix = 1, t.fix, NULL) AS fix, IIF(t.partRankMobile = 1, t.mobile, NULL) AS mobile ,A.field1, A.field2 FROM ( SELECT A.Name, A.Fix, A.mobile , Sum(IIF(A.fix = B.fix OR A.fix=B.mobile, 1, 0)) AS partRankFix , Sum(IIF(A.mobile = B.mobile AND A.mobile = B.fix, 2, IIF(A.mobile = B.mobile OR A.mobile = B.fix, 1, 0))) AS partRankMobile , A.field1, A.field2 FROM yourTable AS A, yourTable AS B WHERE (((Nz(A.fix, 0) < Nz(B.fix, 0)) OR (Nz(B.fix, 0) = Nz(A.fix, 0))) AND (Nz(B.NAME, 0) >= Nz(A.NAME, 0))) GROUP BY A.Name, A.Fix, A.mobile, A.field1, A.field2) AS t


Ok, lo alcancé con este ejemplo.

-Primero creo una tabla para trabajar con:

CREATE TABLE #Table (field1 INT, field2 INT, field3 int)

-Entonces llené los campos con datos similares a los tuyos:

INSERT INTO #Table VALUES(1,2,3) INSERT INTO #Table VALUES(2,2,4) INSERT INTO #Table VALUES(3,2,5) INSERT INTO #Table VALUES(4,3,5)

-Finalmente con la consulta a continuación puede llegar a lo que busca:

SELECT t1.field1,t2.field2,t3.field3 from #Table t1 left join (select field2,min(field1) AS field1 from #Table group by field2) t2 on t1.field1 = t2.field1 left join (select field3,min(field1) AS field1 from #Table group by field3) t3 on t1.field1 = t3.field1

La clave es hacer una combinación a la izquierda con la misma tabla para cada campo que quiera deduplicar siempre haciendo coincidir con el mismo campo "campo1". En cada una de estas tablas, debe agrupar por el campo que desea deduplicar.

Espero eso ayude.