我正在编写一个 TVF 来查询一个大表(数千万行),其中该表中的字符串(邮政编码)与另一个表中的字符串(部分邮政编码(输出代码/扇区部分))匹配。
我遇到了一个我无法解决的边缘情况。
这是一些示例数据。
DECLARE @tab1 TABLE (Sk INT, Postcode VARCHAR(8))
DECLARE @tab2 TABLE (Sk INT, Coverage VARCHAR(8))
INSERT INTO @tab1 (Sk, Postcode) VALUES (1, 'E12 5HH'), (6, 'SW1X 6AA')
INSERT INTO @tab2 (Sk, Coverage) VALUES (1, 'E12'), (1, 'E12 5'),
(2, 'E1'), (2, 'E11'), (2, 'E13'),
(3, 'E12 6'),
(4, 'E12 5') ,
(5, 'E12') ,
(7, 'SW1') ,
(8, 'SW1X')
而我目前的查询
SELECT S.Sk,
S.Postcode,
CoverageSk = X.Sk,
X.Coverage
FROM @tab1 S
OUTER APPLY (
SELECT Sk ,
Coverage ,
[Length] = LEN(Coverage)
FROM @tab2
) X
WHERE S.Sk <> X.Sk
AND LEFT(S.Postcode,X.[Length] ) = X.Coverage
这些是我的结果。
第 1 行和第 4 行的数据不应出现在结果中。第 1 行,覆盖范围或外码“E1”与邮政编码“E12 5HH”的外码部分(“E12”)不同。
对于第 4 行,覆盖范围或输出代码“SW1”与邮政编码“SW1X 6AA”的输出代码(“SW1X”)部分不同。
理想情况下,源表将分解组件部分,以便您可以直接匹配它们。
如果这是不可能的,这适用于示例数据:
SQL Server 可以通过动态搜索使用Postcode上的索引: