Estou escrevendo um TVF para consultar uma tabela grande (dezenas de milhões de linhas) onde uma string (Código Postal) nessa tabela corresponde a uma string (um código postal parcial (parte de código de saída/setor)) de outra tabela.
Estou atingindo um caso extremo que não consigo resolver.
Para quem não conhece os códigos postais do Reino Unido
Aqui estão alguns dados de exemplo.
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')
E minha consulta atual
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
Esses são meus resultados.
Os dados nas linhas 1 e 4 não devem estar nos resultados. Linha 1, A Cobertura ou o código de saída "E1" não é o mesmo que a parte do código de saída ("E12") do CEP "E12 5HH".
O mesmo para a Linha 4, a Cobertura ou o código de saída "SW1" não é o mesmo que a parte do código de saída ("SW1X") do Código Postal "SW1X 6AA".
Idealmente, as tabelas de origem teriam as partes componentes divididas para que você pudesse combiná-las diretamente.
Se isso não for possível, isso funciona para os dados de amostra:
O SQL Server pode usar um índice no código postal por meio de uma busca dinâmica :