segunda-feira, 11 de julho de 2016

Recuperando TOP N linhas de uma consulta relacionada com APPLY

Neste link tem um exemplo muito útil para as situações em que é preciso recuperar as n linhas de uma tabela relacionada para cada registro da tabela mestre, usando o CROSS APPLY (ou OUTER APPLY, quando for o caso).

http://stackoverflow.com/a/2791907/3817131

Cuidado para não cair na armadilha do
SELECT * 
FROM TABLE_A AS a
LEFT JOIN (SELECT TOP 8 id, field1, field2
           FROM TABLE_b) AS b
    ON a.id = b.id
 
Pois este caso traz um jon com as TOP n *GERAL* da tabela B, não de cada linha do lado esquerdo do relacionamento.
Mesmo quando se tenta usar um JOIN/WHERE na subquery pegando a chave da tabela mestre para relacionar como parâmetro é preciso atentar para a sintaxe e para os resultados retornados.
Em alguns casos é preciso fazer uma subquery para  selecionar o resultado de um subquery mais interna.

O APPLY é uma solução elegante do TSQL e de bom desempenho, mas não é ANSI.