Ho una tabella A formata da una sola colonna (NOME_CLIENTE) ed una
TABELLA B con 3 COLONNE (NOME_CLIENTE, CAMPO1, CAMPO2)
Devo restituire una tabella con
A.NOME_CLIENTE, B.NOME_CLIENTE, B.CAMPO1, B.CAMPO2
il problema è che nome cliente (A) e nome cliente (B) sono liste
tirate giù da DB diversi e che contengono informazioni molto diverse
tra loro come struttura ... anche se vogliono dire exactly la stessa
cosa....
Ad esempio
A.NOME_CLIENTE(1) = SAN PELLEGRINO S.P.A. (OVVERO IN FORMA ABBREVIATA
SA.PE. S.p.A.)
A.NOME_CLIENTE(2) = BIG SRL
A.NOME_CLIENTE(3) = FIAT GROUP AUTOMOBILES SPA
e
B.NOME_CLIENTE(1) = SAN PELLEGRINO SPA
B.NOME_CLIENTE(2) = BIG S.R.L
B.NOME_CLIENTE(3) = FIAT GROUP AUTOMOBILES S.p.A. (FGA SPA)
Ora è evidente che il match tra 1,2,3 di A e B è perfetto .... ma
ovviamente questa perfetto match e' difficile farlo capire ad una
query ....
Any Idea?
Grazie in avanza
Hai problemi a farlo capire anche a me... e non sono una query!!! :)
Non esiste nulla di immediato/automatico, inizia a grattarti la pera
che ne esci solo con una megabonifica dei valori
... voglio vedere come dici ad un computer che "SA.PE." = "san
pellegrino"!!!! lmao
In questo caso [abbreviazioni puntate] � piuttosto semplice:
declare @T table(D varchar(20) primary key)
insert into @T values('Sa.Pe.')
insert into @T values('San Pellegrino')
insert into @T values('Automobili Fiat')
insert into @T values('A.F.')
insert into @T values('Pinco Pallino')
insert into @T values('P.P.')
select *
from @T t1
inner join @T t2
on t1.D + ' ' like replace(t2.D, '.', '_% %')
where t1.D!=t2.D
marc.
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://social.microsoft.com/Forums/it-IT/sqlserverit
Appunto... A mano!!! :)
adesso che la guardo meglio... non "ciò" capito 'na fava!!!
Marcello il tuo codice è sempre almeno qualche passo avanti rispetto
ai miei neuroni, ma adesso persino sulla sintassi... :(
Quella on... E quella where... Non capisco il doppio percento ed il
punto esclamativo...
Ciao Lorenzo,
immagino tu ti riferisca al passo:
<not equals operator> ::= <>
Come gi� sostenuto varie volte in questo newsgroup io sono fermamente
convinto che la portabilit� sia un sogno moooolto evanescente.
Lo standard ansi � sicuramente un documento di riferimento interessante
per la comunit� dei dba, ma ha poco a che fare con la realt�.Cross
Applay non � ansi, non in questi termini esatti. Pressoch� tutti gli
hint di vista e di tabella non sono ansi. Tutto il tsql "procedurale"
non � ansi.
Personalmente non inseguo ne mi interessa particolarmente l'adesione
all'ansi. :-)
> Ciao!
marc.
Ma che pirla! "!" è il not... oggi sono in forma :(
Ciao,
Considera una descrizione qualunque, per esempio:
"San Pellegrino Acque Minerali"
Supponiamo ora di derivarne la sigla:
"Sa.Pe.A.M."
La produzione della sigla avviene in questo modo: "Si sotituisce con un
punto un frammento destro di parola", cio�:
[Sa] . == n
[Pe] . == llegrino
[A] . == cque
[M] . == inerali
Di conseguenza la stringa di ricerca like:
"Sa%Pe%A%M%"
Matcha correttamente con la stringa originale.
Una clausola di ricerca potrebbe quindi essere:
t1.D like replace(t2.D, '.', '%')
Questa sintassi � per� troppo morbida infatti matcha anche con:
"Saper Ammaestrare"
Per renderla un po' pi� rigida facciamo queste osservazioni:
1) Il punto sostituisce almeno un carattere
2) Le parole della descrizione originale sono separate da spazi.
Quindi il punto non rappresenta semplicemente "un frammento qualunque
destro", ma:
- Almeno un carattere
- Qualunque cosa
- Uno spazio
Dal nostro "Sa.Pe.A.M." allora deriviamo la like un po' pi� complessa:
"Sa_% Pe_% A_% M_% "
Che tuttavia non matcha con la descrizione a causa dell'aggiunta di uno
spazio finale, quindi:
"San Pellegrino Acque Minerali" + " " like "Sa_% Pe_% A_% M_% "
Che pu� essere riscritto come:
t1.D + ' ' like like replace(t2.D, '.', '_% ')
Io ne ho usata, per distrazione, una versione un po' pi� lassa, del tipo:
t1.D + ' ' like like replace(t2.D, '.', '_% %')
Ammettendo altri caratteri dopo lo spazio ma in realt� la definizione
pi� sopra a singolo % � migliore. Quella a doppio % infatti matcha anche
con:
"Sa_% %Pe_% %A_% %M_% %" -> "Savona Opere Caritatevoli Ma Diaboliche".
Quindi direi che:
select *
from @T t1
inner join @T t2
on t1.D + ' ' like replace(t2.D, '.', '_% ')
where t1.D!=t2.D
E' migliore.
Per quanto riguarda il "!=" si tratta semplicemente dell'operatore "not
equals" in forma "C++". "!=" equivale a "<>"
> Quella on... E quella where... Non capisco il doppio percento ed il
> punto esclamativo...
marc.