Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ndias

Relacionamento de tabelas com like inner join

Recommended Posts

Tenho duas tabelas que não estão relacionadas e preciso ligar o campo de uma tabela a outra.

 

select CURSO FROM tabelaCurso
select Area FROM tabelaArea

 

na tabelaCurso retorna o seguinte resultado, por ex:

Vários

SECRETARIADO EXECUTIVO
ADMINISTRAÇÃO
e na tabelaArea:
Administração Comercial / Vendas
Atendimento a Cliente
Compras
Para juntar as duas eu to fazendo assim:
select * from tabelaArea a inner join tabelaCurso c on c.Curso like ('%' +a.Area+ '%')
Isso me retorna apenas um registro que é o de Administração, visto que o like encontra somente essa área ligada ao curso na tabelaCurso.
Eu tenho dois problemas: um é que se a tabelaCurso conter por ex um curso "Educação Física" e a tabelaArea tiver a área "física" e "educação", o like inner join vai me trazer 3 registros de um só ("Educação", "Física" e "Educação Física").
E o outro problema é que eu gostaria que mostrasse "outros" no lugar daqueles cujo o curso não tivesse a área relacionada.
Tipo assim:
Administração 1
Outros 2
Alguém pode me ajudar, por favor?
Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, Ndias!

A melhor coisa que você pode fazer é relacionar essas duas tabelas, crie uma entidade associativa contendo o id da área e o id do curso relacionado, o retorno dos seus scripts será bem mais rapido que join entre campos de texto usando "like", claro que, dará um pouco mais de trabalho pois essa tabela também deverá ser atualizada quando um novo curso ou área for incluído.

Voltando aos problemas, join com like, a menos que você garanta com 100% de certeza que o nome da Área estará dentro do nome do curso, o resultado não será correto e muit cursos serão jogados pro "outros".

Problema 1 - Caso você tenha as áreas "Física" e "Educação" na tabela de áreas e o curso "Educação Física" seu like vai trazer uma linha pra cada área, ou seja, uma linha com a área "Física" e o curso "Educação Física", e uma linha com a área "Educação" e o curso "Educação Física".

Digamos que a área "Educação" exija cursos como "Letras ou Pedagogia" e a área "Física" seja para Físicos e não para personal trainers, é correto relacionar essas áreas com Educação Física como o like relacionaria?

A criação da entidade associativa resolve essa treta, pois você teria uma linha relacionado a área Física com o curso 'Engenharia nuclear' e a área educação com "pedagogia", "letras" ou até mesmo "educação física" para os casos de instituição de ensino (relações que não apareceriam no "like" pois a string "fisica" não está em "egenharia nuclear" assim como "educação" em "pedagogia" e "Letras").

Problema 2 - Como o relacionamento é da tabela "tabelaarea"(a esquerda) com a "tabelacurso"(a direita), utilize o "right join" no lugar do inner join, assim os cursos que não possuem áreas apresentaram o campo a.area como null, podendo ser tratado com isnull(a.area,'Outros').

Explicações sobre join:

inner join = retorna o que é comum entre a tabela da direita e da esquerda (a diretia e a esquerda do "join")

right join = retorna tudo da tabela da direita e apenas o que é comum da tabela da esquerda (o que não é comum aparece como null)
no seu caso os cursos com áreas relacionadas.

left join = retorna tudo da tabela da esquerda e apenas o que é com da tabela da direita (caso você quisesse retornar "outros" nos casos de areas sem curso, ou caso a tabela cursos estivesse a esquerda do join).

full join = retorna tudo das duas tabelas(null para o que não é comum)

cross join = monta um plano cartesiano, pra cada linha da tabela da direita, retorna todas as linhas da tabela da esquerda.

 

 

Se precisar de ajuda pra montar o esquema de atualização da entidade associativa ou qualquer outra duvida, só entrar em contato.

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

consegui resolver assim:

 

select a.IdArea, ISNULL(a.Area,'Outros') as Area, COUNT(*) as Qtde from tabelaCurso c left join TabelaArea a on a.Area like c.Curso group by a.IdArea, a.Area order by (CASE WHEN (a.IdArea = '' OR a.IdArea IS NULL) THEN 1 ELSE 0 END),a.Area

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, Ndias!

 

A melhor coisa que você pode fazer é relacionar essas duas tabelas, crie uma entidade associativa contendo o id da área e o id do curso relacionado, o retorno dos seus scripts será bem mais rapido que join entre campos de texto usando "like", claro que, dará um pouco mais de trabalho pois essa tabela também deverá ser atualizada quando um novo curso ou área for incluído.

 

Voltando aos problemas, join com like, a menos que você garanta com 100% de certeza que o nome da Área estará dentro do nome do curso, o resultado não será correto e muit cursos serão jogados pro "outros".

 

Problema 1 - Caso você tenha as áreas "Física" e "Educação" na tabela de áreas e o curso "Educação Física" seu like vai trazer uma linha pra cada área, ou seja, uma linha com a área "Física" e o curso "Educação Física", e uma linha com a área "Educação" e o curso "Educação Física".

 

Digamos que a área "Educação" exija cursos como "Letras ou Pedagogia" e a área "Física" seja para Físicos e não para personal trainers, é correto relacionar essas áreas com Educação Física como o like relacionaria?

 

A criação da entidade associativa resolve essa treta, pois você teria uma linha relacionado a área Física com o curso 'Engenharia nuclear' e a área educação com "pedagogia", "letras" ou até mesmo "educação física" para os casos de instituição de ensino (relações que não apareceriam no "like" pois a string "fisica" não está em "egenharia nuclear" assim como "educação" em "pedagogia" e "Letras").

 

Problema 2 - Como o relacionamento é da tabela "tabelaarea"(a esquerda) com a "tabelacurso"(a direita), utilize o "right join" no lugar do inner join, assim os cursos que não possuem áreas apresentaram o campo a.area como null, podendo ser tratado com isnull(a.area,'Outros').

 

Explicações sobre join:

 

inner join = retorna o que é comum entre a tabela da direita e da esquerda (a diretia e a esquerda do "join")

 

right join = retorna tudo da tabela da direita e apenas o que é comum da tabela da esquerda (o que não é comum aparece como null)

no seu caso os cursos com áreas relacionadas.

 

left join = retorna tudo da tabela da esquerda e apenas o que é com da tabela da direita (caso você quisesse retornar "outros" nos casos de areas sem curso, ou caso a tabela cursos estivesse a esquerda do join).

 

full join = retorna tudo das duas tabelas(null para o que não é comum)

 

cross join = monta um plano cartesiano, pra cada linha da tabela da direita, retorna todas as linhas da tabela da esquerda.

 

 

Se precisar de ajuda pra montar o esquema de atualização da entidade associativa ou qualquer outra duvida, só entrar em contato.

Abraço!

 

infelizmente não tenho como fazer o relacionamento dessas tabelas nessas alturas do campeonato com 10 mil registros

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.