高手们帮一下吧,看似简单实则非常复杂的问题

yowbell 2007-07-03 03:50:45
表A有如下字段,fNO,fName
表B有如下字段,Name
数据样式如下:

表A:

fNO fName
-----------------------
01 河北省
01.01 石家庄市
01.01.01 长安区
01.01.02 桥东区
01.01.03 桥西区
01.01.04 新华区
....................................

就是一个全国地区的编码表,一共三级,三级是末级,是最终需要调用的。


表B:


fAA fBB
----------------------

遵化市侯家寨乡
天津市大港区春晖里
河南省焦作市大安路


.............................


现在要实现的功能是根据表B的fBB字段的内容在表A中进行查找到第三级中的名称与fBB字段中相对应的名称,将fNO的值填入fAA字段,比较难的地方是表B的fBB字段值中可能并不与表A的fName字段中的值完全相等,表A中可能是"石家庄市" 表B中可能是"石家庄"
请高手看一看要如何作~~
...全文
314 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellowork 2007-07-04
  • 打赏
  • 举报
回复
更新后:
--查询编码更新成功的
select * from @tb where fAA IS NOT NULL
--查询编码更新不成功的
select * from @tb where fAA IS NULL
yowbell 2007-07-04
  • 打赏
  • 举报
回复
还有一个最重要的问题就是如果用户填写的fBB字段比较有个性,实在没有办法匹配,也要显示出来,以便于知道哪些成功哪些没有成功~~
hellowork 2007-07-04
  • 打赏
  • 举报
回复
上面最后一个回复的代码解决的是二个相同的"新华区"的情况,当区相同时通过判断市和省来确定地区编码.
hellowork 2007-07-04
  • 打赏
  • 举报
回复
charindex(replace(replace(t.fName,'省',''),'市',''),b.fBB) > 0)
---------------------------------------------------------------------------
这个语句就是用来应付楼主所说的情况的.使用这个语句处理之后,A表的fName中的"省"、"市"字样就被空字符''替换掉了,然后使用这样的fName去判断是否出现在了B表的fBB中.
上面回复的测试代码中就已经解决了这个问题,例如:
A表的测试数据中有一行:
select '01.01', '石家庄市' union all /*处理后变成了'石家庄'*/
B表的测试数据中有一行:
select null,'河北省石家庄新华区大安路'
经过处理之后,A表的 '石家庄市' 就变成了 '石家庄',而 '石家庄' 正好出现在了B表的fBB中.
请楼主仔细体会一下上面的回复,或多写些数据测试一下.
yowbell 2007-07-04
  • 打赏
  • 举报
回复
问题是有的fBB字段没有“省”“市”之类字啊
hellowork 2007-07-04
  • 打赏
  • 举报
回复
应该不会出现这样的问题,请楼主多贴些数据,我再测试一下.
yowbell 2007-07-04
  • 打赏
  • 举报
回复
还有个疑问老大,为什么同样的地址经过上面的处理后得到的编码并不相同?
如:
01.02.14 唐山市路北区西北井楼
01.06.02 唐山市路北区西北井楼
32.12.01 唐山市路北区西北井楼
01.02.13 唐山市路南区南厂楼
01.06.03 唐山市路南区南厂楼
32.05.01 唐山市路南区南厂楼

好像相当有规律都是这样
我用的语句是:

select a.fNO,b.f4019 from #ta as b
inner join tItem as a on
len(a.fNO) = 8 and

charindex(replace(replace(replace(a.fName,'省',''),'市',''),'县',''),b.f4019) > 0
and exists(select 1 from tItem as t where len(fNo) = 5 and fNo =

left(a.fNo,5) and

charindex(replace(replace(replace(a.fName,'省',''),'市',''),'县',''),b.f4019) > 0)
and exists(select 1 from tItem as t where len(fNo) = 2 and fNo =

left(a.fNo,2) and

charindex(replace(replace(replace(a.fName,'省',''),'市',''),'县',''),b.f4019) > 0)

语句仍然不能处理如"路南区","南区",这样的类型
yowbell 2007-07-04
  • 打赏
  • 举报
回复
我理解,但实际语句与此还是有些出入不太好解决,并且运行一下试试最终5000多记录计算出了1500多,其余的还是有问题,正在查什么原因
hellowork 2007-07-03
  • 打赏
  • 举报
回复
在二楼的回复就意在消除市区重名的情况,却仍有疏漏,这样修改一下:
----创建测试数据
declare @ta table(fNO varchar(10),fName varchar(10))
insert @ta
select '02', '河南省' union all
select '02.01', '郑州市' union all
select '02.01.01', '海淀区' union all
select '02.01.02', '西城区' union all
select '02.01.03', '东城区' union all
select '02.01.04', '新华区' union all
select '01', '河北省' union all
select '01.01', '石家庄市' union all
select '01.01.01', '长安区' union all
select '01.01.02', '桥东区' union all
select '01.01.03', '桥西区' union all
select '01.01.04', '新华区'
declare @tb table(fAA varchar(10),fBB varchar(30))
insert @tb
select null,'遵化市侯家寨乡' union all
select null,'天津市大港区春晖里' union all
select null,'河北省石家庄新华区大安路'

----查询
select *,a.fNO,b.fBB from @tb as b
inner join @ta as a on
len(a.fNO) = 8 and charindex(replace(replace(a.fName,'省',''),'市',''),b.fBB) > 0
and exists(select 1 from @ta as t where len(fNo) = 5 and fNo = left(a.fNo,5) and charindex(replace(replace(t.fName,'省',''),'市',''),b.fBB) > 0)
and exists(select 1 from @ta as t where len(fNo) = 2 and fNo = left(a.fNo,2) and charindex(replace(replace(t.fName,'省',''),'市',''),b.fBB) > 0)

/*查询结果
fNO fBB
---------- ------------------------------
01.01.04 河北省石家庄新华区大安路
*/

----更新
UPDATE b SET fAA = a.fNO
FROM @tb as b
inner join @ta as a on
len(a.fNO) = 8 and charindex(replace(replace(a.fName,'省',''),'市',''),b.fBB) > 0
and exists(select 1 from @ta as t where len(fNo) = 5 and fNo = left(a.fNo,5) and charindex(replace(replace(t.fName,'省',''),'市',''),b.fBB) > 0)
and exists(select 1 from @ta as t where len(fNo) = 2 and fNo = left(a.fNo,2) and charindex(replace(replace(t.fName,'省',''),'市',''),b.fBB) > 0)

----查看
select * from @tb

/*更新结果
fAA fBB
---------- ------------------------------
NULL 遵化市侯家寨乡
NULL 天津市大港区春晖里
01.01.04 河北省石家庄新华区大安路
*/
hellowork 2007-07-03
  • 打赏
  • 举报
回复
发现问题了.我在二楼的回复和楼上bill024(咖啡熊)的回复都不能排除区或市重名的情况.例如使用下面的测试数据时(有二个同名的新华区),结果应该为:
01.01.04 河北省石家庄新华区大安路
但是运行结果却为:
02.01.04 河北省石家庄新华区大安路

测试数据:
declare @ta table(fNO varchar(10),fName varchar(10))
insert @ta
select '02', '河南省' union all
select '02.01', '郑州市' union all
select '02.01.01', '海淀区' union all
select '02.01.02', '西城区' union all
select '02.01.03', '东城区' union all
select '02.01.04', '新华区' union all
select '01', '河北省' union all
select '01.01', '石家庄市' union all
select '01.01.01', '长安区' union all
select '01.01.02', '桥东区' union all
select '01.01.03', '桥西区' union all
select '01.01.04', '新华区'
declare @tb table(fAA varchar(10),fBB varchar(30))
insert @tb
select null,'遵化市侯家寨乡' union all
select null,'天津市大港区春晖里' union all
select null,'河北省石家庄新华区大安路'
bill024 2007-07-03
  • 打赏
  • 举报
回复
借用一两的数据
declare @ta table(fNO varchar(10),fName varchar(10))
insert @ta
select '01', '河北省' union all
select '01.01', '石家庄市' union all
select '01.01.01', '长安区' union all
select '01.01.02', '桥东区' union all
select '01.01.03', '桥西区' union all
select '01.01.04', '新华区'

declare @tb table(fAA varchar(10),fBB varchar(30))
insert @tb
select null,'遵化市侯家寨乡' union all
select null,'天津市大港区春晖里' union all
select null,'河北省石家庄新华区大安路'


update @tb set fAA=t.fNO
from
(
select a.fNO,b.fBB as fB from @ta a right join @tb b
on b.fBB like '%'+a.fName+'%'
where a.fNO is not null and len(a.fNO)=8
)t
where fBB=t.fB

select * from @tb

fAA fBB
---------- ------------------------------
NULL 遵化市侯家寨乡
NULL 天津市大港区春晖里
01.01.04 河北省石家庄新华区大安路
yowbell 2007-07-03
  • 打赏
  • 举报
回复
UP
hellowork 2007-07-03
  • 打赏
  • 举报
回复
----创建测试数据
declare @ta table(fNO varchar(10),fName varchar(10))
insert @ta
select '01', '河北省' union all
select '01.01', '石家庄市' union all
select '01.01.01', '长安区' union all
select '01.01.02', '桥东区' union all
select '01.01.03', '桥西区' union all
select '01.01.04', '新华区'
declare @tb table(fAA varchar(10),fBB varchar(30))
insert @tb
select null,'遵化市侯家寨乡' union all
select null,'天津市大港区春晖里' union all
select null,'河北省石家庄新华区大安路'

----查询
select d.fNO,b.fBB from @tb as b
inner join @ta as a on len(a.fNO) = 2 and charindex(replace(replace(a.fName,'省',''),'市',''),b.fBB) > 0
inner join @ta as c on len(c.fNO) = 5 and charindex(replace(replace(c.fName,'省',''),'市',''),b.fBB) > 0
inner join @ta as d on len(d.fNO) = 8 and charindex(replace(replace(d.fName,'省',''),'市',''),b.fBB) > 0

/*查询结果
fNO fBB
---------- ------------------------------
01.01.04 河北省石家庄新华区大安路
*/
----更新
UPDATE b SET fAA = d.fNO
FROM @tb as b
inner join @ta as a on len(a.fNO) = 2 and charindex(replace(replace(a.fName,'省',''),'市',''),b.fBB) > 0
inner join @ta as c on len(c.fNO) = 5 and charindex(replace(replace(c.fName,'省',''),'市',''),b.fBB) > 0
inner join @ta as d on len(d.fNO) = 8 and charindex(replace(replace(d.fName,'省',''),'市',''),b.fBB) > 0
----查看
select * from @tb

/*更新结果
fAA fBB
---------- ------------------------------
NULL 遵化市侯家寨乡
NULL 天津市大港区春晖里
01.01.04 河北省石家庄新华区大安路
*/
yowbell 2007-07-03
  • 打赏
  • 举报
回复
数据量非常大

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧