有 2 个表,A(“a”列)和 B(“b”列)。我想查找表 A 列“a”中每个值在表 B 列“b”中出现的次数。
目前,我使用的是蛮力方法,而且速度太慢。解决这个问题的更好方法是什么?
暴力方法:
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
最佳答案
这是一种可能的解决方案。结果并不完全等于您的预期输出,但这是因为我认为表 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
关于sql-server - 有 2 个表,A(a 列)和 B(b 列)。我想找到表A列a中每个值在表B列b中出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35856802/