[Resolvido] Select em Várias Tabelas com Inner Join e mais...
Olá Amigos,
Estou desenvolvendo um select que não apresenta erros mas não executa o que eu gostaria.
Solicito a gentileza de uma ajuda para resolver este problema.
Qualquer ajuda é benvinda!
Tenho várias tabelas em um banco MYSQL.
Apenas para exemplificar, algumas das tabelas são:
- produtos
- secoes
- categorias
- subcategorias
- modelos
- tamanhos
- etc.
No caso, a tabela produtos traz as junções tais como SecaoID, CatId, SubCatID, ModId, etc.
Um primeiro problema surge se eu coloco como Inner Join do select algum campo que não tenha sido preenchido em nenhum dos produtos, algo como o modelo. À partir daí o select não funciona.
Eu tentei fazer uma pré-filtragem realizando um select externo, primeiramente verificando se algum campo da coluna modelos havia sido preenchido. Assim caso não haja preenchimento, eu não coloco no inner join.
Esta alternativa me trouxe a necessidade de mais 6 selects prévios de verificação, o que por si só eu já não sei se é uma boa idéia com relação a desempenho.
Outra coisa, aconteceu que, após algumas filtragens, se ao liberar, por exemplo a construção do select com o Inner join da tabela marcas e obtiver a resposta de 4 produtos e depois liberar o inner join da tabela tamanho, o select considera especificamente a conjunção entre as tabelas e não a soma entre as tabelas. Com isto, os produtos que eram 4, caem para 2 por exemplo, mas que na realidade o termo buscado era uma marca e não um tamanho.
O código segue abaixo para facilitar o entendimento.
'*** Recupero a informação buscada
Dim busca : busca = request("busca")
'*** Verifico se as colunas da tabela de produtos estão sendo utilizadas.
'*** Com base nestas respostas é que vou montar o Select de Inner Joins
Dim SqlMod, RsMod
SqlMod = "Select ModId from tbl_produtos where Length(ModId) > 0 "
Set RsMod = Conn.execute(SqlMod)
Dim SqlTam, RsTam
SqlTam = "Select TamId from tbl_produtos where Length(TamId) > 0"
Set RsTam = Conn.execute(SqlTam)
' Dim SqlCor, RsCor
' SqlCor = "Select CorId from tbl_produtos where CorId <> ''"
' Set RsCor = Conn.execute(SqlCor)
' Dim SqlFab, Rsfab
' SqlFab = "Select FabId from tbl_produtos where FabId <> ''"
' SqlFab = "Select FabId from tbl_produtos where FabId is not null"' Set RsFab = Conn.execute(SqlFab)
' Dim SqlUnid, RsUnid
' SqlUnid = "Select UnidId from tbl_produtos where UnidId <> ''"
' SqlUnid = "Select UnidId from tbl_produtos where UnidId is not null"' Set RsUnid = Conn.execute(SqlUnid)
'*** Declaro variáveis para realizar a busca
Dim SqlSearch, RsSearch
'*** Inicio a string SQL
SqlSearch = SqlSearch & "Select * from ((("
'*** Verifico se a coluna 'ModId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
If not RsMod.Eof then : SqlSearch = SqlSearch & "(" : End If
'*** Verifico se a coluna 'TamId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
If not RsTam.Eof then : SqlSearch = SqlSearch & "(" : End If
'*** Verifico se a coluna 'CorId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string' If not RsCor.Eof then : SqlSearch = SqlSearch & "(" : End If
'*** Verifico se a coluna 'FabId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
' If not RsFab.Eof then : SqlSearch = SqlSearch & "(" : End If
'*** Verifico se a coluna 'UnidId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
' If not RsUnid.Eof then : SqlSearch = SqlSearch & "(" : End If
SqlSearch = SqlSearch & "tbl_produtos Inner Join tbl_secoes On tbl_produtos.SecaoId = tbl_secoes.SecaoId) "
SqlSearch = SqlSearch & "Inner Join tbl_categorias On tbl_produtos.CatId = tbl_categorias.CatId) "
SqlSearch = SqlSearch & "Inner Join tbl_subcategorias On tbl_produtos.SubCatId = tbl_subcategorias.SubCatId) "
'*** Verifico se a coluna 'ModId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
If not RsMod.Eof then : SqlSearch = SqlSearch & "Inner Join tbl_modelos On tbl_produtos.ModId = tbl_modelos.ModId) " : End If
'*** Verifico se a coluna 'TamId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
If not RsTam.Eof then : SqlSearch = SqlSearch & "Inner Join tbl_tamanhos On tbl_produtos.TamId = tbl_tamanhos.TamId) " : End If
'*** Verifico se a coluna 'CorId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
' If not RsCor.Eof then : SqlSearch = SqlSearch & "Inner Join tbl_cores On tbl_produtos.CorId = tbl_cores.CorId) " : End If
'*** Verifico se a coluna 'FabId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
' If not RsFab.Eof then : SqlSearch = SqlSearch & "Inner Join tbl_fabricantes On tbl_produtos.FabId = tbl_fabricantes.FabId) " : End If
'*** Verifico se a coluna 'UnidId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
' If not RsUnid.Eof then : SqlSearch = SqlSearch & "Inner Join tbl_unidades On tbl_produtos.UnidId = tbl_unidades.UnidId) " : End If
SqlSearch = SqlSearch & "where tbl_produtos.ProdNome like '%"&busca&"%' "
SqlSearch = SqlSearch & "or tbl_produtos.ProdDescricao like '%"&busca&"%' "
SqlSearch = SqlSearch & "or tbl_produtos.ProdVolt like '%"&busca&"%' "
SqlSearch = SqlSearch & "or tbl_produtos.ProdCodBarra like '%"&busca&"%' "
SqlSearch = SqlSearch & "or tbl_produtos.ProdRegistro like '%"&busca&"%' "
SqlSearch = SqlSearch & "or tbl_secoes.SecaoNome like '%"&busca&"%' "
SqlSearch = SqlSearch & "or tbl_categorias.CatNome like '%"&busca&"%' "
SqlSearch = SqlSearch & "or tbl_subcategorias.SubCatNome like '%"&busca&"%' "
'*** Verifico se a coluna 'ModId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
If not RsMod.Eof then : SqlSearch = SqlSearch & "or tbl_modelos.ModNome like '%"&busca&"%' " : End If
'*** Verifico se a coluna 'TamId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
If not RsTam.Eof then : SqlSearch = SqlSearch & "or tbl_tamanhos.TamNome like '%"&busca&"%' " : End If
'*** Verifico se a coluna 'CorId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
' If not RsCor.Eof then : SqlSearch = SqlSearch & "or tbl_cores.CorNome like '%"&busca&"%' " : End If
'*** Verifico se a coluna 'FabId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
' If not RsFab.Eof then : SqlSearch = SqlSearch & "or tbl_fabricantes.FabNome like '%"&busca&"%' " : End If
'*** Verifico se a coluna 'UnidId' da tabela 'tbl_produtos está preenchida - se estiver acrescento este trecho na string
' If not RsUnid.Eof then : SqlSearch = SqlSearch & "or tbl_unidades.UnidNome like '%"&busca&"%' " : End If
'*** Encerro a seleção
Set RsSearch = Conn.execute(SqlSearch)
'*** Crio o loop de apresentação dos resultados obtidos
While not RsSearch.eof
Response.write (RsSearch("ProdId")&" - "&RsSearch("ProdNome")&" - "&Left(RsSearch("ProdDescricao"), 30)&"<br />")
RsSearch.movenext
Wend
Qual é a forma correta de se fazer isto, com menos selects e obtendo um resultado perfeito e limpo?
Obrigado!
Alex_ps
Discussão (6)
Carregando comentários...