Usuário com melhor resposta
SELECT COM PARAMETROS

Pergunta
-
Olá estou tentando fazer um select em uma tabela onde preciso filtrar varios campos e deixar somente o que eu realmente vou ultilizar
abaixo segue o SQL QUE ESTOU ULTILIZANDO ELE ESTÁ FUNCIONANDO mas gostaria de saber c existe uma maneira mais logica e profissional de fazer a mesma Query.
Code SnippetSELECT
(SELECT F.* FROM
(SELECT E.* FROM (SELECT D.* FROM (SELECT C.* FROM (SELECT B.* FROM (SELECT A.* FROM (SELECT * FROM escolas WHERE esc_polo LIKE '%1%') AS A WHERE A.esc_modalidade LIKE '%EMEI%') AS B WHERE B.esc_turno_manha LIKE'%1%') AS C WHERE esc_turno_intermediario LIKE '%1%') AS D WHERE esc_turno_tarde LIKE '%1%') AS E WHERE esc_turno_verpertino LIKE '%1%') AS F WHERE esc_turno_noite LIKE '%1%') AS G WHERE esc_turno_integral LIKE '%1%'Bom espero a ajuda da turma mais experiente...ok
Respostas
-
Vagner,
Pelo que entendi você quer aplicar vários filtros com a cláusula like, para isso não existe a necessidade de tabelas derivadas:
SELECT * FROM escolas
WHERE
esc_polo LIKE '%1%'
and esc_modalidade LIKE '%EMEI%'
and esc_turno_manha LIKE'%1%' and esc_turno_intermediario LIKE '%1%' and esc_turno_tarde LIKE '%1%' and esc_turno_verpertino LIKE '%1%' and esc_turno_noite LIKE '%1%' and esc_turno_integral LIKE '%1%'no entanto, é desaconselhada pelo fato de usar vários operadores LIKE ( isso gera uma perda imensa de performance ) .
Se possível,
Procure usar algo do tipo
SELECT * FROM escolas
WHERE
esc_polo ='1'
and esc_modalidade ='EMEI'
and esc_turno_manha ='1' and esc_turno_intermediario ='1' and esc_turno_tarde ='1' and esc_turno_verpertino ='1' and esc_turno_noite ='1' and esc_turno_integral ='1'Abraços,
-
Oi Vagner,
não entendi porque você utilizou diversas sub-consultas. Se o seu objetivo era apenas fazer filtros em todas essas colunas você só precisa utilizar o operador AND:
Code SnippetSELECT * FROM escolas
WHERE esc_polo LIKE '%1%' AND esc_modalidade LIKE '%EMEI%' AND esc_turno_manha LIKE '%1%' AND esc_turno_intermediario LIKE '%1%' AND esc_turno_tarde LIKE '%1%' AND esc_turno_verpertino LIKE '%1%' AND esc_turno_noite LIKE '%1%' AND esc_turno_integral LIKE '%1%'
feito isso, agora vem a minha próxima dúvida, essas colunas, como por exemplo esc_turno_manha armazenam o que? aparentemente me parece que você está usando elas como flags, para indicar se a escola tem ou não turno na manha, se esse for o caso o melhor seria utilizar colunas do tipo bit e não varchar, além disso, se não for realmente necessário, eu acho que seria interessante remover o % inicial nas verificações, porque em alguns casos isso pode gerar uma má utilização dos indíces no sql server. Exemplo: esc_turno_manha = '1' ou esc_turno_manha LIKE '1%' ao invés de utilizar LIKE '%1%'
abraço,
-
Oi Vagner,
ok, mas utilizando a primeira consulta, que tanto eu quanto o Demétrio enviou você não tem esse problema, por causa do %. Se o usuário não enviou o paramêtro, a consulta simplesmente irá retornar todos os registros daquela coluna:
Code SnippetSELECT * FROM escolas
WHERE esc_polo LIKE '%1%' AND esc_modalidade LIKE '%EMEI%' AND esc_turno_manha LIKE '%1%' AND esc_turno_intermediario LIKE '%1%' AND esc_turno_tarde LIKE '%1%' AND esc_turno_verpertino LIKE '%1%' AND esc_turno_noite LIKE '%1%' AND esc_turno_integral LIKE '%1%'
Caso o usuário não forneça o parametro esc_polo, por exemplo, a consulta irá retornar todos os registros que tenha esc_polo LIKE '%%', ou seja, todo mundo...
[ ]'s
Todas as Respostas
-
Vagner,
Pelo que entendi você quer aplicar vários filtros com a cláusula like, para isso não existe a necessidade de tabelas derivadas:
SELECT * FROM escolas
WHERE
esc_polo LIKE '%1%'
and esc_modalidade LIKE '%EMEI%'
and esc_turno_manha LIKE'%1%' and esc_turno_intermediario LIKE '%1%' and esc_turno_tarde LIKE '%1%' and esc_turno_verpertino LIKE '%1%' and esc_turno_noite LIKE '%1%' and esc_turno_integral LIKE '%1%'no entanto, é desaconselhada pelo fato de usar vários operadores LIKE ( isso gera uma perda imensa de performance ) .
Se possível,
Procure usar algo do tipo
SELECT * FROM escolas
WHERE
esc_polo ='1'
and esc_modalidade ='EMEI'
and esc_turno_manha ='1' and esc_turno_intermediario ='1' and esc_turno_tarde ='1' and esc_turno_verpertino ='1' and esc_turno_noite ='1' and esc_turno_integral ='1'Abraços,
-
Oi Vagner,
não entendi porque você utilizou diversas sub-consultas. Se o seu objetivo era apenas fazer filtros em todas essas colunas você só precisa utilizar o operador AND:
Code SnippetSELECT * FROM escolas
WHERE esc_polo LIKE '%1%' AND esc_modalidade LIKE '%EMEI%' AND esc_turno_manha LIKE '%1%' AND esc_turno_intermediario LIKE '%1%' AND esc_turno_tarde LIKE '%1%' AND esc_turno_verpertino LIKE '%1%' AND esc_turno_noite LIKE '%1%' AND esc_turno_integral LIKE '%1%'
feito isso, agora vem a minha próxima dúvida, essas colunas, como por exemplo esc_turno_manha armazenam o que? aparentemente me parece que você está usando elas como flags, para indicar se a escola tem ou não turno na manha, se esse for o caso o melhor seria utilizar colunas do tipo bit e não varchar, além disso, se não for realmente necessário, eu acho que seria interessante remover o % inicial nas verificações, porque em alguns casos isso pode gerar uma má utilização dos indíces no sql server. Exemplo: esc_turno_manha = '1' ou esc_turno_manha LIKE '1%' ao invés de utilizar LIKE '%1%'
abraço,
-
Bom entendi a sua colocão mas o problema e bem mais grave rsrsr .
O que ocorre e que eu estou criando relatorios no sistema entaum
preciso fazer um SELECT no banco de acordo com os parametros passados pelo usuario,
mas quando eu uso o AND vou ter os resultados exatos na consulta .. ate ai sem problemas
mas se o usuario não passar o parametro a consulta naum obtem o resultado desejado
usando o like até conseguir um resultado legal mais ainda acho que existe uma saida bem mais logica para isso.
Bom pra ser mais exato rsrs
O SELECT tem que filtrar a tabela somente com os parametros passados caso o parametro venha vazio ele tem que
continuar o filtro com o proximo parametro por isso usei o SELECT COM SELECT
Code SnippetSELECT
H.* FROM(
SELECT G.* FROM (SELECT F.* FROM (SELECT E.* FROM (SELECT D.* FROM (SELECT C.* FROM //--> E ASSIM SEQUE A QUERY (SELECT B.* FROM //-->SELECT QUE FILTRA O SELEC ANTERIOR (SELECT A.*FROM escolas AS A WHERE esc_polo LIKE '%%') //-->SELECT PRINCIPAL AS B WHERE B.esc_modalidade LIKE '%%') AS C WHERE C.esc_turno_manha LIKE'%%') AS D WHERE D.esc_turno_intermediario LIKE '%%') AS E WHERE E.esc_turno_tarde LIKE '%%') AS F WHERE F.esc_turno_verpertino LIKE '%%') AS G WHERE G.esc_turno_noite LIKE '%%') AS H WHERE H.esc_turno_integral LIKE '%%'REALMENTE EU SEI QUE NAUM E A MANEIRA MAIS CORRETA DE FAZER ..RSRSR
POR ISSO PRECISO DA AJUDA DA GALERA
-
-
Oi Vagner,
ok, mas utilizando a primeira consulta, que tanto eu quanto o Demétrio enviou você não tem esse problema, por causa do %. Se o usuário não enviou o paramêtro, a consulta simplesmente irá retornar todos os registros daquela coluna:
Code SnippetSELECT * FROM escolas
WHERE esc_polo LIKE '%1%' AND esc_modalidade LIKE '%EMEI%' AND esc_turno_manha LIKE '%1%' AND esc_turno_intermediario LIKE '%1%' AND esc_turno_tarde LIKE '%1%' AND esc_turno_verpertino LIKE '%1%' AND esc_turno_noite LIKE '%1%' AND esc_turno_integral LIKE '%1%'
Caso o usuário não forneça o parametro esc_polo, por exemplo, a consulta irá retornar todos os registros que tenha esc_polo LIKE '%%', ou seja, todo mundo...
[ ]'s
-
Concordo com o Felipe F..
Caso o usuário não envie nenhum parâmetro a consulta ficaria assim:
Code SnippetSELECT * FROM escolas
WHERE esc_polo LIKE '%%' AND esc_modalidade LIKE '%%' AND esc_turno_manha LIKE '%%' AND esc_turno_intermediario LIKE '%%' AND esc_turno_tarde LIKE '%%' AND esc_turno_verpertino LIKE '%%' AND esc_turno_noite LIKE '%%' AND esc_turno_integral LIKE '%%'
Daí, isso retornaria todos os registros.
Abraços
-
BOM GALERA MTO BOM
AGRADESÇO A AJUDA DE TODOS RESOLVI O PROBLEMAS COM ESSAS DICAS
ESTAMOS SEM DBA AKI NA EMPRESA ENTAUM JAH VIU NEH ..
AS VEZES DEXAMOS PASSAR COISAS TÃO SIMPLES ASSIM SEM PERCEBER
EU ESTAVA DANDO VOLTAS ....RSRSR REALMENTE OBRIGADO MESMO
ESPERO TAMBEM PODER AJUDAR .
MTO OBRIGADO A TODOS
.