T-SQL: laço para popular tabela associativa

Uma tabela associativa implementa relacionamentos muitos-para-muitos entre tabelas/classes, armazenando pares de chaves estrangeiras. Veja como usar um laço para popular tabela associativa em T-SQL.

Mas, o que é T-SQL?

Só para ilustrar, Transact-SQL é uma extensão proprietária da Microsoft para SQL, que adiciona recursos como programação procedural, variáveis locais e manipulação de exceções, sendo usada para gerenciar e consultar dados em bancos de dados SQL Server. Pretendo daqui em diante, oferecer mais dicas, sugestões e soluções nesta extensão do SQL.

T-SQL laço para popular tabela associativa - Muitos para muitosO que é uma tabela associativa?

Primordialmente, uma tabela associativa, no contexto do Modelo Relacional e Orientação a Objetos, é uma estrutura que implementa relacionamentos muitos-para-muitos entre duas tabelas ou classes, armazenando pares de chaves estrangeiras que referenciam as entidades relacionadas. É quando você tem duas classes e uma contém uma lista da outra.

Dessa forma, suponha que temos duas tabelas, Estudantes e Cursos , e queremos modelar um relacionamento muitos-para-muitos onde cada estudante pode estar matriculado em vários cursos, e cada curso pode ter vários estudantes matriculados.

Tabelas principais:

Estudantes

  • EstudanteID (Chave Primária)
  • NomeEstudante

Cursos

  • CursoID (Chave Primária)
  • NomeCurso

Tabela Associativa:

EstudantesCursos

  • EstudanteID (Chave Estrangeira, referencia Estudantes.EstudanteID)
  • CursoID (Chave Estrangeira, referencia Cursos.CursoID)

Exemplo de Dados:

Estudantes

EstudanteID NomeEstudante
1 Alice
2 Beto

Cursos

CursoID NomeCurso
101 Matemática
102 Literatura

EstudantesCursos

EstudanteID CursoID
1 101
1 102
2 101

Explicação:

  • Alice (EstudanteID 1) está matriculada nos cursos de Matemática (CursoID 101) e Literatura (CursoID 102).
  • Beto (EstudanteID 2) está matriculado apenas no curso de Matemática (CursoID 101).

Como resultado, a tabela EstudantesCursos associa estudantes a cursos, permitindo o gerenciamento do relacionamento muitos-para-muitos entre as duas entidades.

O laço para popular a associativa

Dessa maneira, o laço `WHILE` em T-SQL mostrado realiza a inserção de registros em uma tabela associativa chamada, `TABELAMAIOR_TABELAMENOR`, para criar um relacionamento entre `TABELAMAIOR` e `TABELAMENOR`.

DECLARE @counter INT = (SELECT TOP 1 ID_TABELAMAIOR FROM TABELAMAIOR)
DECLARE @counterMAJ INT = (SELECT COUNT(*) FROM [TABELAMAIOR])
DECLARE @counterMIN INT = (SELECT COUNT(*) FROM [TABELAMENOR])
DECLARE @RandomNumber INT = (SELECT ABS(CHECKSUM(NEWID())) % @counterMIN + 1)

WHILE @counter <= @counterMAJ
BEGIN

    INSERT INTO [TABELAMAIOR_TABELAMENOR] ([ID_TABELAMAIOR], [ID_TABELAMENOR])
    VALUES (@counter, @RandomNumber)    

    SET @counter = @counter + 1

SET @RandomNumber = (SELECT ABS(CHECKSUM(NEWID())) % @counterMIN + 1)
END

Em síntese: vamos detalhar cada parte do código:

Declaração e Inicialização de Variáveis

1. `DECLARE @counter INT = (SELECT TOP 1 ID_TABELAMAIOR FROM TABELAMAIOR)`: Declara a variável `@counter` e a inicializa com o valor do primeiro `ID_TABELAMAIOR` da tabela `TABELAMAIOR`.
2. `DECLARE @counterMAJ INT = (SELECT COUNT(*) FROM [TABELAMAIOR])`: Declara a variável `@counterMAJ` e a inicializa com a contagem total de registros na tabela `TABELAMAIOR`.
3. `DECLARE @counterMIN INT = (SELECT COUNT(*) FROM [TABELAMENOR])`: Declara a variável `@counterMIN` e a inicializa com a contagem total de registros na tabela `TABELAMENOR`.
4. `DECLARE @RandomNumber INT = (SELECT ABS(CHECKSUM(NEWID())) % @counterMIN + 1)`: Declara a variável `@RandomNumber` e a inicializa com um número aleatório entre 1 e o número de registros na tabela `TABELAMENOR`.

Laço WHILE

O laço `WHILE` executa enquanto `@counter` for menor ou igual ao valor de `@counterMAJ` (número total de registros em `TABELAMAIOR`).

Dentro do laço:

1. `INSERT INTO [TABELAMAIOR_TABELAMENOR] ([ID_TABELAMAIOR], [ID_TABELAMENOR]) VALUES (@counter, @RandomNumber)`: Insere um registro na tabela associativa `TABELAMAIOR_TABELAMENOR` com `ID_TABELAMAIOR` igual ao valor atual de `@counter` e `ID_TABELAMENOR` igual ao valor de `@RandomNumber`.
2. `SET @counter = @counter + 1`: Incrementa `@counter` em 1.
3. `SET @RandomNumber = (SELECT ABS(CHECKSUM(NEWID())) % @counterMIN + 1)`: Gera um novo valor aleatório para `@RandomNumber`.

Explicação Geral

Desta forma, o laço está inserindo pares de `ID_TABELAMAIOR` e `ID_TABELAMENOR` na tabela `TABELAMAIOR_TABELAMENOR`, criando assim um relacionamento entre as duas tabelas. Cada `ID_TABELAMAIOR` é associado a um `ID_TABELAMENOR` aleatório, e o processo se repete até que todos os registros de `TABELAMAIOR` tenham sido processados.

Exemplo de Execução

  • Suponha que `TABELAMAIOR` tem 5 registros com `ID_TABELAMAIOR` de 1 a 5, e `TABELAMENOR` tem 3 registros com `ID_TABELAMENOR` de 1 a 3.
  • O laço começa com `@counter` igual a 1 (primeiro `ID_TABELAMAIOR`) e continua até 5 (total de registros em `TABELAMAIOR`).
  • Portanto, em cada iteração, um `ID_TABELAMENOR` aleatório (entre 1 e 3) é associado ao `ID_TABELAMAIOR` atual.

Enfim, esse processo pode ser útil, por exemplo, para associar alunos a cursos aleatórios, produtos a categorias, etc., dependendo do contexto da aplicação.

Links externos

Para pegar todos os códigos associados em um repositório no GitHub clique aqui.

Para rodar este laço em um script no SQL Server confira este link aqui.