Usando o SQL como um pacote ISAM (Método de Acesso Sequencial Indexado) glorificado. Em particular, aninhando cursores em vez de combinar instruções SQL em uma única instrução, embora maior. Isso também conta como 'abuso do otimizador', pois, na verdade, não há muito que o otimizador possa fazer. Isso pode ser combinado com declarações não preparadas para máxima ineficiência:
DECLARE c1 CURSOR FOR SELECT Col1, Col2, Col3 FROM Table1
FOREACH c1 INTO a.col1, a.col2, a.col3
DECLARE c2 CURSOR FOR
SELECT Item1, Item2, Item3
FROM Table2
WHERE Table2.Item1 = a.col2
FOREACH c2 INTO b.item1, b.item2, b.item3
...process data from records a and b...
END FOREACH
END FOREACH
A solução correta (quase sempre) é combinar as duas instruções SELECT em uma:
DECLARE c1 CURSOR FOR
SELECT Col1, Col2, Col3, Item1, Item2, Item3
FROM Table1, Table2
WHERE Table2.Item1 = Table1.Col2
-- ORDER BY Table1.Col1, Table2.Item1
FOREACH c1 INTO a.col1, a.col2, a.col3, b.item1, b.item2, b.item3
...process data from records a and b...
END FOREACH
A única vantagem da versão de loop duplo é que você pode identificar facilmente as quebras entre os valores na Tabela1 porque o loop interno termina. Isso pode ser um fator nos relatórios de quebra de controle.
Além disso, a classificação no aplicativo geralmente é um não-não.