Procurar quais as linhas que têm valores diferentes para uma dada coluna na Teradata SQL

Estou a tentar comparar dois endereços do mesmo ID para ver se coincidem. Por exemplo:

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
Só estou a tentar descobrir se a morada de cada identificação corresponde. Então, neste caso, eu quero retornar apenas ID 3 como tendo um endereço diferente para os códigos de Endereço 1 e 2.

Author: Hatt, 2012-12-04

4 answers

Junta-te à tabela e dá-lhe dois pseudónimos diferentes (A e B no exemplo seguinte). Isto permite comparar diferentes linhas da mesma tabela.

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

A comparação "menos do que" < garante que você recebe 2 endereços diferentes e você não recebe os mesmos 2 códigos de endereço duas vezes. Usando "not equal" <> em vez disso, daria os códigos como (1, 2) e (2, 1); cada um deles para o A alias e o B alias por sua vez.

A cláusula de adesão é responsável pelo emparelhamento das linhas em que, como a cláusula "onde", testa condições adicionais.


A consulta acima funciona com qualquer código de endereço. Se quiser comparar endereços com códigos de endereços específicos, poderá alterar a pesquisa para

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 isto possa ser útil para encontrar clientes com um endereço de facturação (código de Endereço = 1 como exemplo) diferente do endereço de entrega (código de Endereço = 2) .

 31
Author: Olivier Jacot-Descombes, 2018-12-07 13:55:29

Isto funciona para PL / SQL:

select count(*), id,address from table group by id,address having count(*)<2
 4
Author: Yasin Okumuş, 2012-12-04 17:18:37

Pode fazer isto usando um grupo por:

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

Outra maneira de escrever isto pode parecer mais clara, mas não funciona tão bem:

select id, addressCode
from t
group by id, addressCode
having count(distinct address) > 1
 3
Author: Gordon Linoff, 2012-12-04 17:17:32

Pessoalmente, eu imprimi-los-ia a um ficheiro usando Perl ou Python no formato

<COL_NAME>:  <COL_VAL>

Para cada linha de modo a que o ficheiro tenha tantas linhas quantas as colunas. Em seguida, eu faria um diff entre os dois arquivos, assumindo que você está no Unix ou compará-los usando uma utilidade equivalente em outro SO. Se tiver vários conjuntos de registos (isto é, mais do que uma linha), eu iria pré-enviar para cada linha de ficheiro e então o ficheiro teria NUMER_DB_ROWS * NUM_COLS linhas

 0
Author: amphibient, 2012-12-04 17:14:38