sql-server - 有 2 个表,A(a 列)和 B(b 列)。我想找到表A列a中每个值在表B列b中出现的次数

标签 sql-server

有 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

最佳答案

这是一种可能的解决方案。结果并不完全等于您的预期输出,但这是因为我认为表 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/

相关文章:

sql-server - 等值连接的 SQL Server 查询表示

asp.net mvc 键 'attachdbfilename' 的值无效

sql - 如何在 SQL Server 中有效地查找以特定值结尾的非常大的表中的行?

sql - 根据另一个表中的信息构建行更改的历史跟踪

where 子句中的 SQL 日期差异

c# - 向存储过程 DateTime 参数发送空值时出错

sql-server - SQL Server 版本控制与 git 集成?

c# SELECT 与 FOR JSON

sql - 如何在 SQL Server 中生成加密安全号码?

c# - 数据类型为int的列有加密方法吗?