请帮忙想想如何写这个sql语句:查所有同音字姓名的同学,求更好的方法(200分)

  • 主题发起人 主题发起人 whitehorse
  • 开始时间 开始时间
W

whitehorse

Unregistered / Unconfirmed
GUEST, unregistred user!
设有表table1:学号,姓名,性别,年龄
table2:汉字,拼音码
要求按姓名查找,如输入'赵明',则查询结果要求将姓名为
赵明,昭明明,吴朝名起,赵鸣钢,照明,王罩铭,等所有包含查询字符串同音字的姓名都找出来.
姓名为2-4个汉字.输入查询的条件为2-4个汉字.

我的解决办法:
第一步,找出输入姓名各字的拼音码,然后根据拼音码,找出各字的所有同音字
形成了四个字符串,str1是第一个字的同音字,str2是第二个字的同音字.str3..str4.
第二步,遍历数据库一条记录一条记录的比较,
while not eof do
如果length(当前记录姓名)=2个汉字
1 如姓名的第一个字在str1串中并且姓名的第二个字在str2中 则insert into 结果库
2 如姓名的第一个字在str2串并且姓名的第二个字在str3串中 则insert into
3 如姓名的第一个字在str3串并且姓名的第二个字在str4串中 则insert into
如果 length(当前记录姓名)=3个汉字
1.
2.
如果length(当前记录姓名)=4个汉字
1.
下一条记录 next;

显示结果库

请各位高手提出更简单的办法.
 
用sql语句很简单。
1、找出‘赵明’的每个字的拼音,A:=ZHAO,B:=MING
2、INSERT INTO 结果表 (SELECT 插入字段1,插入字段2,..... FROM TABLE1
WHERE SUBSTR(姓名,1,2) IN (SELECT 汉字 FROM TABLE2
WHERE 拼音码=A OR 拼音码=B)
OR SUBSTR(姓名,3,2) IN (SELECT 汉字 FROM TABLE2
WHERE 拼音码=A OR 拼音码=B)
...........)
OR 的个数可由库中'姓名'最大长度而定.
完成.
 
不是太好做,用存储过程好一点!
 
其实你为什么不这样做呢?表结构为
姓名 拼音 。。。。。
以后查询只要根据拼音查询就好了
 
to 天真
如果 是:使用:表结构如姓名,拼音的格式:你想想多少数据冗余,而且录入时也得查汉字拼
音码,因此一个 结构为拼音码,汉字的表是不可少的.
to zct99,谢谢你的提示,我觉得也应该这样写,可我写的sql语句不能产生预料中的结果
我写的语句详细介绍如下:
学员表:编号,姓名 拼音表:拼音码,汉字
输入姓名,找出所有同音字姓名,如果输入的名字少于学员表中姓名的长度,则学员表中有
相同输入汉字串或同音字串的姓名记录也显示出来.
简化一步,设只输入两个汉字 拼音码为zhao ming
select 编号,姓名 from 学员表 where
((substring(姓名,1,2) in (select 汉字 from 拼音表 where 拼音码='zhao'))
and substring(姓名,3,2) in (select 汉字 from 拼音表 where 拼音码='ming')))
如果where使用两个条件 结果是一个空集
如果使用其中一个条件,结果如同所料,连接两个条件的and 换成 or 不能满足需要.
 
在表一中增加拼音码,用数据冗余来减少查询时的效率问题是个可行的方法.录入时查汉字拼
音码也不复杂.
想一想吧!
 
在table1表中加’拼音‘字段,然后用SQL 'select * from table1 like where
拼音='...';就OK , 我们公司的‘医药管理系统'就这么做,用拼音输入药名和客户名。
 

我觉得,表中增加一个拼音字段不够灵活,不如另投一个拼音码表.
如果在信息表中加一个拼音码字段,当需要修改某一个字的拼音编码的时候,就得改所有的包含
这个字的记录,使用单独的拼音码表就不会有这样的麻烦,而且这个拼音码表可以随时换成
五笔码等其它编码.使用拼音字段就不能这样.
而且如果这个数据库足够大时,使用拼音字段太浪费空间了.


 
呵数据是冗余了,
但是有没有想过,
你这样速度会增加多少??
有时候是必须牺牲空间来取得速度的
你看看如果你那样做语句好写吗?
 
关注,顺便问一下各位大虾,如何取得一个字的拼音码?
 
取得一个字的是很简单的
charindex
 
这可能是中国程序员的毛病,我也有这个倾向,使用一个或一串结构复杂的sql结构
使数据的存储看起来更加完美.
取拼音码,得有一个拼音编码与单字汉字对应的数据库表:delphi开发资源上有.
 
继续希望大侠能提供较好算法的sql
 
whitehorse:
我再说一点,如果他输入的要查询的字长短不是两个字,就更不好写了,是不是
所以个人认为应该用我的方法,不过我也希望有人提出更好的方法,在此听!
 
关键看你这个程序是做什么用的:
如果是商业软件的话同意天真的说法。现在这个年代,硬盘已不是什么昂贵的东东了,海量存储已是平民化的消费了。所以效率是关键。早些年,当然要考虑空间问题。
如果是自己写着玩的,或上交的设计什么的。还是whitehorse的做法好,毕竟,程序员总要在这种算法上考虑最优化。
hehe
 
请问在哪里能取到得有一个拼音编码与单字汉字对应的数据库表!
delphi开发资源的地址是多少!
谢谢!
 
$B0A1..$B0C4 : result := 'A';
$B0C5..$B2C0 : result := 'B';
$B2C1..$B4ED : result := 'C';
$B4EE..$B6E9 : result := 'D';
$B6EA..$B7A1 : result := 'E';
$B7A2..$B8C0 : result := 'F';
$B8C1..$B9FD : result := 'G';
$B9FE..$BBF6 : result := 'H';
$BBF7..$BFA5 : result := 'J';
$BFA6..$C0AB : result := 'K';
$C0AC..$C2E7 : result := 'L';
$C2E8..$C4C2 : result := 'M';
$C4C3..$C5B5 : result := 'N';
$C5B6..$C5BD : result := 'O';
$C5BE..$C6D9 : result := 'P';
$C6DA..$C8BA : result := 'Q';
$C8BB..$C8F5 : result := 'R';
$C8F6..$CBF9 : result := 'S';
$CBFA..$CDD9 : result := 'T';
$CDDA..$CEF3 : result := 'W';
$CEF4..$D188 : result := 'X';
$D1B9..$D4D0 : result := 'Y';
$D4D1..$D7F9 : result := 'Z';
 
如果 想要速度快,而且查询又方便的话,最好再加一个拼音字段,这样做好处多多哦!
 
agree 天真!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
625
import
I
后退
顶部