2016-03-08 155 views
2

有2个表A(列'a')和B(列'b')。我想查找表B列'b'的表A'a'列中每个值的出现次数。有2个表格,A(列a)和B(列b)。我想查找表A列a列中每个值的出现次数b列表b

目前,我正在使用蛮力的方法,它太慢了。有什么可以更好地解决这个问题?

实施例:

enter image description here

输出

enter image description here

蛮力方法:

WHILE(SELECT COUNT(*) FROM A) > 0 
BEGIN 
    DECLARE @Val VARCHAR(100); 
    DECLARE @ValSpaceMod VARCHAR(100); 
    DECLARE @ModSpaceValSpaceMod VARCHAR(100); 
    DECLARE @ModSpaceVal VARCHAR(100); 
    DECLARE @cnt integer; 

    SELECT TOP 1 @Val = a FROM A 

    SET @ValSpaceMod = @Val + ' %'; 
    SET @ModSpaceVal = '% ' + @Val; 
    SET @ModSpaceValSpaceMod = '% ' + @Val + ' %'; 

    SELECT @cnt = COUNT(*) FROM B 
    WHERE (LOWER(B.b) LIKE lower(@Val) 
     OR LOWER(B.b) LIKE lower(@ValSpaceMod) 
     OR LOWER(B.b) LIKE LOWER(@ModSpaceValSpaceMod) 
     OR LOWER(B.b) LIKE LOWER(@ModSpaceVal) 
     ) 

    PRINT @Val + ' ' + CAST(@cnt AS VARCHAR) 

    DELETE A WHERE a= @Val 
END 
+0

考虑使用[全文搜索](https://msdn.microsoft.com/en-us/library/ms142571.aspx)。 –

回答

1

这里是一个可能的解决方案。结果并不完全等于您的预期输出,但那是因为我认为表B上的第四行应增加A计数。如果这是不正确的,请让我知道,所以我可以调整脚本。

if object_id ('tempdb..#tbT1') is not null 
drop table #tbT1 
GO 

if object_id ('tempdb..#tbT2') is not null 
drop table #tbT2 
GO 

create table #tbT1 (
    v char(1) collate SQL_Latin1_General_CP1_CI_AS 
) 

create table #tbT2 (
    t varchar(255) collate SQL_Latin1_General_CP1_CI_AS 
) 

insert into #tbT1 
values ('A'), ('B'), ('C'), ('D') 

insert into #tbT2 
values ('A first value B second value'), 
    ('B second value D fourth value'), 
    ('D fourth value'), 
    ('C third value Afirst') 


select t1.v, sum (
    len(t2.t) - len(replace(t2.t, ' ' + t1.v + ' ', ' ')) -- middle occurrences 
    + case when t2.t like t1.v + ' %' then 1 else 0 end -- add starting occurence 
    + case when t2.t like '% ' + t1.v then 1 else 0 end -- add ending occurence 
) as nOccurencies 
from #tbT1 t1, #tbT2 t2 
group by t1.v 
+0

搜索词的计数只能在搜索词完全匹配时才增加,而不是另一个词的子字符串。 Ex - 在字符串为“** A **美好的一天”,“什么** a **捕捉!”,“不完整** A **”的情况下,计数会增加 它不应该增加案例:“Wh_a_t”,“_A_dd” – user2276910

+0

我已更新脚本以执行不区分大小写的比较,并忽略另一个单词个案的子字符串。 – EduardoCMB

+0

我所做的调整将不起作用...让我工作...给我几分钟 – EduardoCMB

1

请尝试下面的查询(获取在表中的每个值A柱使用关键字like“A”在表B中的列“B”的发生次数)

SELECT [A].a AS SearchTerm 
     ,( SELECT count(*) 
      FROM [B] 
      WHERE b LIKE '%'+[A].a+' %' 
      COLLATE Latin1_General_CS_AS) AS Occurrences 
FROM [A] 
相关问题