Introdução
“Com os caracteres ‘A’, ‘B’, ‘C’ e ‘D’, quantas e quais são as strings de 2 caracteres que podemos formar?”
Este é um típico problema de análise combinatória envolvendo arranjos de elementos de um conjunto. Neste caso, o conjunto é formado por 4 elementos (os caracteres ‘A’, ‘B’, ‘C’, ‘D’) e para resolver o problema, devemos determinar todos grupos de 2 elementos (strings de 2 letras distintas) considerando a ordem dos caracteres (ou seja: a string “AB” é diferente de “BA”). A resposta para a questão proposta é dada a seguir:
“AB”, “AC”, “AD”, “BA”, “BC”, “BD”, “CA”, “CB”, “CD”, “DA”, “DB”, “DC”
Neste exemplo, realizamos um arranjo de 4 elementos tomados 2 a 2. O total de strings geradas foi 12. De uma maneira geral, um arranjo de n elementos r a r, representado por A(n,r) produz um total de n! / (n-r)! subconjuntos. Considerando nosso exemplo: 4! / (4-2)! = 12.
Arranjos com SQL
No artigo anterior, mostramos um exemplo de SQL capaz de resolver o problema do arranjo dos elementos de uma tabela tomados 2 a 2. Nós vimos que o modelo para a construção de um SQL deste tipo consiste na utilização de 3 regras:
- Fazer o “self-join” da tabela-alvo (ou seja, instancia-la duas vezes), porém sem utilizar nenhuma condição de junção (sem ligar as duas instâncias da tabela por nenhum campo).
- Dar apelidos diferentes para cada uma das duas instâncias da tabela.
- Aplicar restrições na cláusula WHERE para evitar a produção de linhas contendo elementos repetidos.
Como exemplo, considere a tabela T_CONJUNTO, cujo conteúdo é apresentado na Figura 1. Esta tabela possui apenas um campo, denominado ELEMENTO.
Figura 1. Tabela T_CONJUNTO
O SQL para realizar o arranjo destes elementos 2 a 2 é apresentado abaixo (OBS: reveja o artigo anterior sobre Análise Combinatória em caso de dúvidas):
Listagem 1: Arranjo dos Elementos 2 a 2
SELECT * FROM T_CONJUNTO C1, T_CONJUNTO C2
WHERE C1.ELEMENTO <> C2.ELEMENTO
O resultado é dado a seguir:
Figura 2. Resultado da Consulta - Arranjos dos elementos 2 a 2
Ordenando os Resultados
Observe que o resultado mostrado na Figura 2 não ficou ordenado da forma “bonitinha” mostrada no início desse artigo (começar mostrando os grupos onde A é o primeiro elemento, depois B, depois C, depois D). Mas podemos resolver isso facilmente utilizando a cláusula ORDER BY, conforme mostra a listagem abaixo:
Listagem 2: Arranjo dos Elementos 2 a 2 - Ordenando pelo Primeiro Elemento
SELECT * FROM T_CONJUNTO C1, T_CONJUNTO C2
WHERE C1.ELEMENTO <> C2.ELEMENTO
ORDER BY C1.ELEMENTO, C2.ELEMENTO
Figura 3. Resultado da Consulta - Arranjos dos elementos 2 a 2 - Ordenando pelo Primeiro Elemento
Nos próximos artigos, mostraremos que com SQL também podemos produzir arranjos 3 a 3, 4 a 4, etc. Além disso, trataremos das combinações. Até breve!