好,所以我有两个桌子。表1具有参考数字列(A),第二列具有随机字符串(B)。表2只有一列,其中列出了可能在表1的字符串中也可能不在字符串中的值。
dbo.Tbl_1
+--+---------------------------------------+ |A |B | +--+---------------------------------------+ |24|BLUE; KITTEN; WHITE; PINK; SLOPE; GREEN| +--+---------------------------------------+ |51|GREEN; CLOUDY; WHITE; CHIPS | +--+---------------------------------------+ |78|PATRIOTS; PINK; PINK; WHITE | +--+---------------------------------------+ |22|WHITE; RED; TREES; AMY; GREEN | +--+---------------------------------------+
dbo.Tbl_2
+-----+ |C | +-----+ |BLUE | +-----+ |WHITE| +-----+ |PINK | +-----+ |BROWN| +-----+
哪种SQL查询将确定在Table1的字符串中找到Table2的值的次数是多少?基本上我想返回以下结果集:
+-----+----+ |BLUE |1 | +-----+----+ |WHITE|4 | +-----+----+ |PINK |3 | +-----+----+ |BROWN|NULL| +-----+----+
仅供参考:实际上,表2具有大约200条唯一记录。表1记录了约160万条记录,并带有唯一的参考号。这两个表都不是静态的。
我玩了一下,想出了这个SQL提琴
相关的SELECT查询看起来像这样(尽管需要两次表扫描,但我确信它可以变得更有效率):
select C, sum(dbo.CountOccurancesOfString(B, C)) as number from Tbl_1 join Tbl_2 on 1=1 group by C order by number desc
编辑 这是我从这个答案得到的功能:
CREATE FUNCTION dbo.CountOccurancesOfString ( @searchString nvarchar(max), @searchTerm nvarchar(max) ) RETURNS INT AS BEGIN return (LEN(@searchString)-LEN(REPLACE(@searchString,@searchTerm,'')))/LEN(@searchTerm) END