sql >> Base de Datos >  >> RDS >> Mysql

Comparación de filas en la tabla para diferencias entre campos

Cualquier expresión en SQL debe hacer referencia a columnas solo en una fila (salvo subconsultas).

Un JOIN se puede usar para convertir dos filas diferentes en una fila del conjunto de resultados.

Entonces puede comparar valores en diferentes filas haciendo una autounión. Aquí hay un ejemplo que muestra la unión de cada fila con todas las demás filas asociadas con el mismo cliente (excluyendo la unión de una fila consigo misma):

SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)

Ahora puedes escribir expresiones que comparen columnas. Por ejemplo, para restringir la consulta anterior a aquellas en las que el campo1 difiere:

SELECT c1.*, c2.*
FROM client c1
JOIN client c2 ON (c1.clientID = c2.clientID AND c1.id <> c2.id)
WHERE c1.field1 <> c2.field1;

No especificas qué tipo de comparaciones necesitas hacer, así que te lo dejo a ti. El punto clave es que, en general, puede usar una autocombinación para comparar filas en una tabla determinada.

Re sus comentarios y aclaraciones:Bien, entonces su "diferencia" no es simplemente por valor sino por posición ordinal de la fila. Recuerda que las bases de datos relacionales no tienen un concepto de número de fila, solo tienen orden de filas con respecto a algún orden que debes especificar en un ORDER BY cláusula. No confunda el "id " pseudoclave con número de fila, los números se asignan como monótonamente crecientes solo por coincidencia de su implementación.

En MySQL, puede aprovechar las variables definidas por el usuario para conseguir el efecto que buscas. Ordenar la consulta por clientId y luego por id y realizar un seguimiento de los valores por columna en las variables de usuario de MySQL. Cuando el valor en una fila actual difiere del valor en la variable, resalte lo que iba a hacer. Mostraré un ejemplo para un campo:

SET @clientid = -1, @field1 = '';
SELECT id, clientId, field1, @clientid, @field1,
  IF(@clientid <> clientid, 
    ((@clientid := clientid) AND (@field1 := field1)) = NULL,
    IF (@field1 <> field1, 
      (@field1 := field1), 
      NULL
    )
  ) AS field1_changed
FROM client c
ORDER BY clientId, id;

Tenga en cuenta que esta solución no es realmente diferente de simplemente seleccionar todas las filas con SQL simple y rastrear los valores con variables de aplicación a medida que obtiene filas.