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.
O 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, referenciaEstudantes.EstudanteID)CursoID(Chave Estrangeira, referenciaCursos.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.

O que é uma tabela associativa?