like 的子查询统计

hztltgg 2013-10-14 02:57:50
表A有一个字段,Word,很多单词
表B有很多列,其中一列有一个字段Name,包含表A里的Word字符串。
想统计表A的Word在表B中出现的次数

不知道怎么写,谢谢

就是A表
Word
aa
bb
cc

表B
Id Name
1 aa3343
2 cc234324
3 3432bb
4 2343bb

能得到
aa 1
bb 2
cc 1
...全文
291 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称被占用了 2013-10-14
  • 打赏
  • 举报
回复
设计问题,应该在b表增加字段,存放拆分出来的与a表匹配的关键字(这个过程可考虑作业进行) 在新增字段索引,查询两表直接=连接,速度就没问题了
唐诗三百首 2013-10-14
  • 打赏
  • 举报
回复
建议用视图索引,即用空间换时间的方案.
hztltgg 2013-10-14
  • 打赏
  • 举报
回复
因为我a,b两表都是视图,原始数据库数据更多,我试了下,a表也就20条还能查询,超过就出错,看来还得另外想办法。
guguda2008 2013-10-14
  • 打赏
  • 举报
回复
引用 10 楼 hztltgg 的回复:
[quote=引用 9 楼 guguda2008 的回复:] [quote=引用 7 楼 hztltgg 的回复:] 试了上面几个方法,由于a表单词很多,7万多个,b表也有2万条,每次都是 错误消息: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。 没办法查
把超时时间设长,然后慢慢等,或者把单词表分批查找,或者用全文索引,或者用第三方软件如lucene、hubble[/quote] 选项里已经设置为0,执行超时值 0 秒,无超时了,也不知道还有哪儿能做[/quote] 那你就把A表拆成N个小表,每个不超过M行记录,M取决于你那机器牛B的程度,你可以用把原语句里的FROM A改成FROM (SELECT TOP M FROM A)的形式来测试多少是可行的,M从1开始,以1,10,50,100,500,1000这几个数字递增。
-Tracy-McGrady- 2013-10-14
  • 打赏
  • 举报
回复

select Word,COUNT=(
  select COUNT(1) from B where CHARINDEX(Word,Name)>0)
from A
LongRui888 2013-10-14
  • 打赏
  • 举报
回复
引用 7 楼 hztltgg 的回复:
试了上面几个方法,由于a表单词很多,7万多个,b表也有2万条,每次都是 错误消息: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。 没办法查
其实上面的方法都是模糊查询相当于需要对2万*7万,也就是14亿的数据量,确实会超时的。 最好表B的name字段中的字符串,能有分隔符,比如'aa,3344',这样的话,可以通过函数先把b表的2万条数据,先拆分,然后就可以直接和表a关联,这样速度应该会快的
hztltgg 2013-10-14
  • 打赏
  • 举报
回复
引用 9 楼 guguda2008 的回复:
[quote=引用 7 楼 hztltgg 的回复:] 试了上面几个方法,由于a表单词很多,7万多个,b表也有2万条,每次都是 错误消息: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。 没办法查
把超时时间设长,然后慢慢等,或者把单词表分批查找,或者用全文索引,或者用第三方软件如lucene、hubble[/quote] 选项里已经设置为0,执行超时值 0 秒,无超时了,也不知道还有哪儿能做
guguda2008 2013-10-14
  • 打赏
  • 举报
回复
引用 7 楼 hztltgg 的回复:
试了上面几个方法,由于a表单词很多,7万多个,b表也有2万条,每次都是 错误消息: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。 没办法查
把超时时间设长,然后慢慢等,或者把单词表分批查找,或者用全文索引,或者用第三方软件如lucene、hubble
唐诗三百首 2013-10-14
  • 打赏
  • 举报
回复
因为是模糊搜索,没办法优化. 可以考虑用视图索引.
hztltgg 2013-10-14
  • 打赏
  • 举报
回复
试了上面几个方法,由于a表单词很多,7万多个,b表也有2万条,每次都是 错误消息: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。 没办法查
Landa_Jimmy 2013-10-14
  • 打赏
  • 举报
回复

create table #a (word varchar(50))
insert into #a
select 'aa' union all
select 'bb' union all
select 'cc'

create table #b(id int,name varchar(50))
insert into #b
select 1,'aa3343' union all
select 2,'cc234324' union all
select 3,'3432bb' union all
select 4,'2343bb'

select word,count(*)qty from (
	select * from #a,#b
) cte where word=substring(name,patindex('%[a-zA-Z]%',name),2)
group by word
--------------------------------------------------------------
word                                               qty
-------------------------------------------------- -----------
aa                                                 1
bb                                                 2
cc                                                 1

(3 行受影响)
Andy__Huang 2013-10-14
  • 打赏
  • 举报
回复
--或者:
;with A(word) as
(
select 'aa'
union all select 'bb'
union all select 'cc'
),
B(Id,Name) as
(
select 1,'aa3343'
union all select 2,'cc234324'
union all select 3,'3432bb'
union all select 4,'2343bb'
)

select Word,SUM(case when CHARINDEX(Word,Name)>0 then 1 else 0 end) as count
from A
left join B on CHARINDEX(Word,Name)>0
group by Word

/*
Word	count
aa	1
bb	2
cc	1
*/
LongRui888 2013-10-14
  • 打赏
  • 举报
回复


declare @A table
(
Word varchar(100)
)

insert into @A
select 'aa' union all
select 'bb' union all
select 'cc'

declare @B table
(
Id int,
Name varchar(100)
)
insert into @B 
select 1 , 'aa3343' union all
select 2 , 'cc234324' union all
select 3 , '3432bb' union all
select 4 , '2343bb'

select Word,
       COUNT(b.Name)
from @A a
left join @B b
       on b.Name like '%'+a.word+'%'
group by Word
/*
Word	(无列名)
aa	1
bb	2
cc	1
*/

唐诗三百首 2013-10-14
  • 打赏
  • 举报
回复

create table 表A(Word varchar(10))

insert into 表A
 select 'aa' union all
 select 'bb' union all
 select 'cc'

create table 表B
(Id int, name varchar(10))

insert into 表B
 select 1, 'aa3343' union all
 select 2, 'cc234324' union all
 select 3, '3432bb' union all
 select 4, '2343bb'
 

select Word,qty
 from 表A a
 outer apply
 (select count(1) 'qty' from 表B b
  where charindex(a.Word,b.name,1)>0) t
 
/*
Word       qty
---------- -----------
aa         1
bb         2
cc         1

(3 row(s) affected)
*/
Andy__Huang 2013-10-14
  • 打赏
  • 举报
回复
;with A(word) as ( select 'aa' union all select 'bb' union all select 'cc' ), B(Id,Name) as ( select 1,'aa3343' union all select 2,'cc234324' union all select 3,'3432bb' union all select 4,'2343bb' ) select Word,COUNT=(select COUNT(1) from B where CHARINDEX(Word,Name)>0) from A /* Word COUNT aa 1 bb 2 cc 1 *
Andy__Huang 2013-10-14
  • 打赏
  • 举报
回复
select Word,COUNT=(select COUNT(1) from B where CHARINDEX(Word,Name)>0) from A

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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