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:

  1. 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).
  2. Dar apelidos diferentes para cada uma das duas instâncias da tabela.
  3. 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.

Tabela T_CONJUNTO

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:

Resultado da Consulta - Arranjos dos elementos 2 a 2

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
 
 Resultado da Consulta - Arranjos dos elementos 2 a 2 - Ordenando pelo Primeiro 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!