Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Usenet -> c.d.o.server -> Re: SQL question...
PL/SQL will make this easy for you.
Step 1: Make a cursor that gets all of the TableA records which have matching locations in TableB.
CURSOR location_match IS
SELECT firstname, streetname, streetno, houseno, city FROM TableA WHERE EXISTS (SELECT NULL FROM TableB WHERE TableA.streetname = TableB.streetname AND TableA.streetno = TableB.streetno AND TableA.houseno = TableB.houseno AND TableA.city= TableB.city);
Step 2: Make a cursor to retrieve the TableB records ...
CURSOR B_Records IS
SELECT firstname
FROM TableB
WHERE streetname = name
AND streetno = no AND houseno = h_no AND city = c;
Step 3: loop through records using the following routine:
OPEN location_match;
LOOP
FETCH location_match INTO TableA_name, name, no, h_no, c; EXIT WHEN location_match%NOTFOUND; OPEN B_records; LOOP FETCH B_Records INTO TableB_name; EXIT WHEN B_Records%NOTFOUND; x := 1; LOOP EXIT WHEN x > LENGTH(TableB_name); IF x = 1 THEN compare_names := '?'||substr(TableB_name,2,LENGTH(TableB_name)-1); ELSIF x = LENGTH(TableB_name) THEN compare_names := substr(TableB_name,1,LENGTH(TableB_name)-1)||'?'; ELSE compare_names := substr(TableB_name,1,x-1)||'?'||substr(TableB_name,x-1,x+1); END IF; IF TableA_name LIKE compare_names THEN TableB_name := TableA_name; <do update ...> x = LENGTH(TableB_name)+1; ENDIF; END LOOP; END LOOP; CLOSE B_records;
PS. The IF statements within the internal LOOP (ie. IF x=1 ... IF x=LENGTH(_) are a pretty common routines when doing a char by char comparison and replacement. I always use this when removing (what I call) 'ghost' characters from data imported from another application that may have added some 'extra' ASCII anywhere from 1-20 into the data fields.
Sayoni wrote:
> Hi guys,
> I was wondering if anyone can help me write this query..I am a newbie and
> don't really know the intricacies yet...
>
> I have two tables....
> TableA (id int, firstname,streetno, streetname,houseno,city)
> TableB (id int, firstname,streetno, streetname,houseno,city)
>
> TableA has all "correct" data and TableB may have some spelling mistakes in
> the firstname. eg. it may have 'Sudan' instead of 'Susan' . Now what I would
> like to do is, look through TableB and try to match the firstname with the
> firstname of TableA where everything else matches except the firstname.
>
> So basically
> TableA.streetname = TableB.streetname and
> TableA.streetno = TableB.streetno and
> TableA.houseno = TableB.houseno and
> TableA.city= TableB.city and
> substr(TableA.firstname,1,1) = substr(TableB.firstname,1,1)
>
> ..then go about replacing one letter at a time and match it with the rest.
> If it matches then basically I have found a match...
> eg...
> Find the length of the firstname and loop through the firstname length no of
> times.
>
> In the first round I will replace 'S?dan' and match it with 'S?san'
> it does not match so I loop through again and say 'Su?an' and match it with
> 'Su?an'
> it matches so i exit the loop and consider it matched.
>
> does it all make sense? thanks a lot in advance.
>
> Sayoni Mookerjee
> Snr. Analyst Programmer
> MOS Data, North Sydney
> (Work) : +61 (02) 9510 1370
> (Mobile) :+61 (041) 322 1277
>
> Sent via Deja.com http://www.deja.com/
> Before you buy.
Received on Sun Jan 23 2000 - 17:55:23 CST
![]() |
![]() |