none
SELECT COM PARAMETROS RRS feed

  • 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 Snippet

    SELECT G.* FROM

     (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

     

     

    quinta-feira, 6 de novembro de 2008 12:24

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,

     

    quinta-feira, 6 de novembro de 2008 12:42
  •  

    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 Snippet

    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%'

     

     

     

    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,

    quinta-feira, 6 de novembro de 2008 12:48
  • 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 Snippet

    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%'

     

    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

    quinta-feira, 6 de novembro de 2008 13:16

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,

     

    quinta-feira, 6 de novembro de 2008 12:42
  •  

    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 Snippet

    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%'

     

     

     

    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,

    quinta-feira, 6 de novembro de 2008 12:48
  • 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 Snippet

     

    SELECT 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

     

    quinta-feira, 6 de novembro de 2008 13:04
  • Vagner,

     

    Mas algumas situações e decisões dependem em muito da análise e compreensão do seu ambiente e cenário.

    quinta-feira, 6 de novembro de 2008 13:13
  • 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 Snippet

    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%'

     

    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

    quinta-feira, 6 de novembro de 2008 13:16
  • Concordo com o Felipe F..

     

    Caso o usuário não envie nenhum parâmetro a consulta ficaria assim:

     

    Code Snippet

    SELECT * 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

    quinta-feira, 6 de novembro de 2008 13:24
  •  

    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 .

    quinta-feira, 6 de novembro de 2008 13:34