Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Join tra due tabelle con campo join non "codice"

2 views
Skip to first unread message

Riccardin dal Ciuffo

unread,
Nov 19, 2009, 12:00:18 PM11/19/09
to
Il mio problema è il seguente

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

dawn

unread,
Nov 19, 2009, 12:51:04 PM11/19/09
to
On 19 Nov, 18:00, Riccardin dal Ciuffo <riccardo.bove...@gmail.com>
wrote:

>
> 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 ....

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

Marcello

unread,
Nov 19, 2009, 1:04:14 PM11/19/09
to
dawn ha scritto:
> .... 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.

Lorenzo Benaglia

unread,
Nov 19, 2009, 4:21:32 PM11/19/09
to
"Marcello" <marcello...@epomops.it> wrote:
> where t1.D!=t2.D
marc, occhio allo standard ANSI ;-)
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://social.microsoft.com/Forums/it-IT/sqlserverit

dawn

unread,
Nov 20, 2009, 2:35:45 AM11/20/09
to
On 19 Nov, 19:04, Marcello <marcello.pole...@epomops.it> wrote:
>
> 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')
>

Appunto... A mano!!! :)

dawn

unread,
Nov 20, 2009, 2:44:02 AM11/20/09
to
On 19 Nov, 19:04, Marcello <marcello.pole...@epomops.it> wrote:
> 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.')
>
> select *
> from @T t1
> inner join @T t2
> on t1.D + ' ' like replace(t2.D, '.', '_% %')
> where t1.D!=t2.D

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...

Marcello

unread,
Nov 20, 2009, 3:39:29 AM11/20/09
to
Lorenzo Benaglia ha scritto:

> "Marcello" <marcello...@epomops.it> wrote:
>> where t1.D!=t2.D
> marc, occhio allo standard ANSI ;-)
> http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

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.

dawn

unread,
Nov 20, 2009, 3:52:30 AM11/20/09
to
On 20 Nov, 09:39, Marcello <marcello.pole...@epomops.it> wrote:
>
> <not equals operator> ::= <>

Ma che pirla! "!" è il not... oggi sono in forma :(

Marcello

unread,
Nov 20, 2009, 4:02:39 AM11/20/09
to
dawn ha scritto:

>> select *
>> from @T t1
>> inner join @T t2
>> on t1.D + ' ' like replace(t2.D, '.', '_% %')
>> where t1.D!=t2.D
>
> 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... :(

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.

0 new messages