我有两张表G1DM和S1DM。我想匹配G1DM和S1DM中的NAME列与最大匹配数。问题是初始的整个名称是针对S1DM给出的,但是在G1DM中,初始值在另一列中给出为ABBREVI。我应该通过考虑空格等来匹配两个表中的最大名称数。因为S1DM中的条目ARUNKUMAR A R在G1DM中作为ARUN KUMAR给出,其初始值在ABBREVI中给出。后来我需要匹配同时也有DOB的名字。请提供解决方案。
我正在使用Oracle。
TABLES:
1) S1DM
NAME
ABDUL RASHEED K
ARUN ALPHONSE
ARUN BHASKAR
ARUNKUMAR A R
CHANDRASEKHARAN P
DILEEPAN P
E B PRASAD
JEYAKUMAR K
JOE KURUVILLA EASOW
JOHN N V
LEKHA R
LILA KUMARY S
NISHA A K
NOUSAD M
PRASAD R
RADHAMONI A K
RAJEESH T
RAJESH M G
REJI V KURIAKOSE
RENI LUKOSE
RENJITH P
SASIDHARAN V M
SHAJAHAN A
SHIJU K K
SHINOI K R
SIDHAKUMAR V
SOMASUNDARAM P
SUJITH KUMAR J S
WILSON MATHEW T
DOB 30-05-79
81年5月11日
30-05-82
27-05-79
21-11-55
15-05-81
24-05-62
68年7月5日
15-02-62
20-05-63
29-05-59
58年1月6日
17-09-61
31-05-71
26-05-64
26-05-59
26-05-74
30-05-73
76年1月4日
17-03-81
16-03-80
27-09-59
59年12月5日
31-05-79
76年4月4日
25-05-78
21-05-59
20-04-80
60年2月1日
2)G1DM
命名
ABDUL RASHEED
ARUN ALPHONSE
ARUN BHASKAR
ARUN KUMAR
DANIEL DEVARAJ
迪利潘
JEYAKUMAR
JOE KURUVILLA EASOW
JOHN
NOUSAD
普拉萨德
普拉萨德
RADHAMONI
RAJEESH
RAJESH
REJI.V.KURIAKOSE
RENI LUKOSE
SASIDHARAN
萨蒂恩
SHAJAHAN
石咀
SIDHAKUMAR
SIVANANDAN
SOMASUNDARAM
SUJITH KUMAR
SUSHAMAKUMARI
WILSON MATHEW
ABBEVI
ķ
NULL
NULL
A.R
NULL
P
ķ
NULL
N.V
中号
E.B
[R
A.K
Ť
M.G
NULL
NULL
V.M。
P K
一个。
K.K。
诉P>
ķ。
P上。
J.S。
S上。
吨。
DOB
30-05-79
81年5月11日
30-05-82
27-05-79
20-08-55
15-05-81
68年7月5日
15-02-62
20-05-63
31-05-71
24-05-62
26-05-64
26-05-59
26-05-74
30-05-73
76年1月4日
17-03-81
27-09-59
20-05-57
59年12月5日
31-05-79
25-05-78
57年9月12日
21-05-59
20-04-80
30-04-57
60年2月1日
我使用的查询是:
选择c.name,b.name来自S1DM c内部联接G1DM在c.name上像concat('%',b.name);
从S1DM c内连接G1DM b中选择c.name,b.name((c.name如concat(b.name,'%'))和c.dob = b.dob);
通过使用这些我得到了条目,但名称Prasad来了两次..而ARUNKUMAR也不匹配..请给我一个解决方案
答案 0 :(得分:1)
与其他说明相反,这是相当简单的。由于您使用的是Oracle,因此可以使用TRIM
和REPLACE
的组合来消除abbrevi列中的点。您的联接需要考虑两种情况 - 在您的某些数据中,首字母在名称之前,而在某些情况下,它们在名称之后。我建议使用IN
来涵盖这两种情况。
如果没有将ARUNKUMAR与ARUN KUMAR相匹配,您的查询可以这样写。
SELECT c.name, b.name
FROM S1DM c JOIN G1DM b
ON c.name IN (
TRIM( REPLACE(b.abbrevi, '.', ' ') || ' ' || b.name),
TRIM( b.name || ' ' || REPLACE(b.abbrevi, '.', ' ')))
AND c.dob = b.dob
要处理两个名称之间空格不匹配的情况,可以从两个名称中完全消除空格。那将是这样的。
SELECT c.name, b.name
FROM S1DM c JOIN G1DM b
ON REPLACE(c.name, ' ', '') IN (
REPLACE(b.abbrevi, '.', '') || REPLACE(b.name, ' ', ''),
REPLACE(b.name, ' ', '') || REPLACE(b.abbrevi, '.', ''))
AND c.dob = b.dob