2016-03-08 214 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] 
相關問題