2012-12-04 10 views
15

Sto provando a confrontare due indirizzi dello stesso ID per vedere se corrispondono. Ad esempio:Trova quali righe hanno valori diversi per una data colonna in SQL

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 

Sto solo cercando di capire se l'indirizzo per ogni ID corrisponde. Quindi, in questo caso voglio tornare solo ID 3 come avere un indirizzo diverso per Indirizzo Codice 1 e 2.

+2

Cool! Che cosa hai provato? –

+0

Quale RDBMS? Se SQL Server, prova a guardare [questa domanda] (http://stackoverflow.com/q/510916/1220971). – Bridge

+0

Mi dispiace, sto usando questo all'interno di Teradata. –

risposta

23

Unire la tabella con se stessa e assegnargli due alias diversi (A e B) . Ciò consente di confrontare diverse righe della stessa tabella.

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 

Il "meno" rispetto < assicura che si ottiene 2 indirizzi diversi e non si ottiene gli stessi 2 codici di indirizzo due volte. Usando "non uguale" <> invece, si otterrebbero i codici come (1, 2) e (2, 1); ognuno di essi per l'alias A e l'alias B a turno.

La clausola join è responsabile per l'associazione delle righe in cui la clausola where verifica condizioni aggiuntive.


UPDATE:

La query sopra funziona con qualsiasi codici di indirizzo. Se si desidera confrontare gli indirizzi con codici di indirizzo specifici, è possibile modificare la query per

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 

immagino che questo potrebbe essere utile per trovare i clienti che possiedono un indirizzo di fatturazione (Codice Indirizzo = 1 come esempio) diverso dal indirizzo di consegna (Codice indirizzo = 2).

+1

Grande, grazie mille! –

+0

wow, molto cleaver. Grazie per aver fornito entrambi gli esempi. – JoshYates1980

0

Personalmente, li stampa su un file utilizzando Perl o Python nel formato

<COL_NAME>: <COL_VAL> 

per ogni riga in modo che il file abbia tante linee quante sono le colonne. Quindi farei un diff tra i due file, supponendo che tu sia su Unix o li confronti usando qualche utilità equivalente su un altro SO. Se si dispone di più recordset (cioè più di una riga), preferirei anteporre una riga a ciascun file e NUM_DB_ROWS * NUM_COLS linee

+2

-1. Scusate.Il dump di dati SQL in un file esterno da diff con Perl o Python è semplicemente sbagliato; "So come usare questo martello, quindi trattiamo tutto come un chiodo". La soluzione non risolve affatto la domanda, che era come farlo ** in SQL **. –

+0

Il vantaggio di scrivere uno script per farlo è che può essere fatto funzionare per qualsiasi tabella senza che tu debba specificare i nomi delle colonne in quanto possono essere letti dalle tabelle di sistema. Ho scritto un paio di script come questo per i QAs che dovevano confrontare i recordset su diversi database in cui solo SQL non sarebbe stato sufficiente e, anche se fosse così, avrebbero dovuto scrivere una query personalizzata per ogni tabella diversa per riflettere colonne diverse. I soli dati specifici della tabella nei miei script, oltre a, ovviamente, i particolari della tabella come il nome, lo schema e il server, sarebbero la stringa dei criteri. – amphibient

+0

Ma rispetto al dover scrivere ogni nome di colonna, è relativamente poca configurazione personalizzata. SQL è un ottimo strumento ma ha limiti risoluti che sono meglio superare al di fuori di esso (in cose come i linguaggi di scripting) piuttosto che le istruzioni SQL che assomigliano a una macchina Rube Goldberg. Mi piacciono la pulizia, la struttura e la semplicità. Puoi mantenere il tuo downvote, non ti sto chiedendo di cambiare questo, questa elaborazione è più della mia filosofia per il resto del mondo – amphibient

1

È possibile farlo usando un gruppo:

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

Un altro modo di scrivere questo può sembrare più chiaro, ma non esegue così:

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

Questo funziona per PL/SQL:

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