Quiero comparar valores de table a & c y encontrar diferencias. Podemos especificar unique_key de table a comparando la id entre table a & b , y al hacer coincidir la unique_key de la table b & c , podemos comparar el Name de table a & c .
¿Podemos obtener la lista de filas cuyo Name tiene un valor diferente para la table a & c ?
Así que si escribo tabla,
table a +----+------+-----------+ | id | Name | int_value | +----+------+-----------+ | a1 | aa | 1 | | a2 | bb | 2 | | a3 | cc | 5 | +----+------+-----------+ table b +----+------+-----------+ | id | Name |unique_key | +----+------+-----------+ | a1 | !! | u1 | | a2 | @@ | u2 | | a3 | ## | u3 | +----+------+-----------+ table c +----+------+-----------+ | id | Name |unique_key | +----+------+-----------+ | c1 | aa | u1 | | c2 | B1 | u2 | | c3 | C1 | u3 | +----+------+-----------+Como resultado, quiero obtener
NameA NameC unique_key bb B1 u2 cc C1 u3Probé este sql, pero ninguno de ellos me dio el resultado correcto. ¿Qué harías?
SELECT a.Name, c.Name, b.unique_key FROM a INNER JOIN b ON a.id = b.id LEFT JOIN c ON b.unique_key = c.unique_key and NOT EXISTS (SELECT * FROM a WHERE a.Name = b.Name);sql real (para DB real) que hice
SELECT i.*, g.*, r.g_id FROM i INNER JOIN r ON i.id = r.id LEFT JOIN g ON r.g_id = g.g_id WHERE CAST('i.name1' as varbinary) != CAST('g.name1' as varbinary) OR CAST('i.name2' as varbinary) != CAST('g.name2' as varbinary) OR CAST('i.name3' as varbinary) != CAST('g.name3' as varbinary) GROUP BY i.id LIMIT 30;error que tengo:
Error occurred.SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'varbinary) != CAST(Puede cast el field como BINARY antes de comparar
por defecto aa y AA , ambos son iguales
SELECT i.*, g.*, r.g_id FROM i INNER JOIN r ON i.id = r.id LEFT JOIN g ON r.g_id = g.g_id WHERE CONVERT('i.name1' , BINARY) != CONVERT('g.name1' , BINARY) OR CONVERT('i.name2' , BINARY) != CONVERT('g.name2' , BINARY) OR CONVERT('i.name3', BINARY) != CONVERT('g.name3', BINARY) GROUP BY i.id LIMIT 30;Parece que solo quieres algunas uniones y una comparación:
select a.name as nameA, c.name as nameC, b.unique_key from a join b on a.id = b.id join c on b.unique_key = c.unique_key where a.name <> c.name; No veo por qué sería necesaria una comparación binaria para las columnas llamadas name . Pero puede usar la palabra clave binary si es realmente necesaria (no es necesaria para sus datos de muestra).
Además, su pregunta es específicamente sobre nombres diferentes, no sobre filas faltantes. Entonces, las uniones externas tampoco parecen apropiadas.