sql join teradata rows matching

Encuentre qué filas tienen diferentes valores para una columna dada en Teradata SQL



join rows (4)

Estoy tratando de comparar dos direcciones de la misma ID para ver si coinciden. Por ejemplo:

Id Adress Code Address 1 1 123 Main 1 2 123 Main 2 1 456 Wall 2 2 456 Wall 3 1 789 Right 3 2 100 Left

Solo estoy tratando de averiguar si la dirección de cada ID coincide. Entonces, en este caso, quiero devolver solo el ID 3 que tiene una dirección diferente para los códigos de dirección 1 y 2.


Únete a la tabla consigo misma y dale dos alias diferentes ( A y B en el siguiente ejemplo). Esto permite comparar diferentes filas de la misma tabla.

SELECT DISTINCT A.Id FROM Address A INNER JOIN Address B ON A.Id = B.Id AND A.[Adress Code] < B.[Adress Code] WHERE A.Address <> B.Address

La comparación "menor que" < garantiza que obtengas 2 direcciones diferentes y que no obtengas los mismos 2 códigos de dirección dos veces. Usando "no igual" <> cambio, produciría los códigos como (1, 2) y (2, 1); cada uno de ellos para el alias A y el alias B a su vez.

La cláusula de unión es responsable del emparejamiento de las filas donde, al igual que la cláusula where, prueba condiciones adicionales.

La consulta anterior funciona con cualquier código de dirección. Si desea comparar direcciones con códigos de dirección específicos, puede cambiar la consulta a

SELECT A.Id FROM Address A INNER JOIN Address B ON A.Id = B.Id WHERE A.[Adress Code] = 1 AND B.[Adress Code] = 2 AND A.Address <> B.Address

Imagino que esto podría ser útil para encontrar clientes que tengan una dirección de facturación (Código de dirección = 1 como ejemplo) que difiera de la dirección de entrega (Código de dirección = 2).


Esto funciona para PL / SQL:

select count(*), id,address from table group by id,address having count(*)<2


Personalmente, los imprimiría en un archivo usando Perl o Python en el formato

<COL_NAME>: <COL_VAL>

para cada fila de modo que el archivo tenga tantas líneas como columnas. Luego haría una diff entre los dos archivos, asumiendo que está en Unix o comparándolos usando alguna utilidad equivalente en otro sistema operativo. Si tiene varios conjuntos de registros (es decir, más de una fila), añadiría ante cada fila de archivo y luego el archivo tendría NUM_DB_ROWS * NUM_COLS líneas


Puedes hacerlo usando un grupo por:

select id, addressCode from t group by id, addressCode having min(address) <> max(address)

Otra forma de escribir esto puede parecer más clara, pero no funciona tan bien:

select id, addressCode from t group by id, addressCode having count(distinct address) > 1