none
CONSULTA MYSQL COM VÁRIAS CRITÉRIOS RRS feed

  • Discussão Geral

  • Boa tarde, alguém poderia dar alguma dica pra uma consulta não ficar tão extensa com vários critérios.

    Por exemplo, eu tenho 64 criterios, desejo criar uma consulta. Estou fazendo assim.

    .. where Filial = @Filial1 Or Filial = @Filial2 Or Filial = @Filial3" e assim por diante, porém são 64 critérios.

    Vocês acham que com tantos critérios a consulta ficará lenta ?

    Vale salientar que, esse criterios são salvo no banco como true ou false, por exemplo coluna1: Filial_Tal_Usuario_Tem_Permissao?, se for true, irá ter permissao para aquela filial e for false não irá ter. No caso na consulta só irei utilizar os true, existe alguma maneira de pegar somentes os true para fazer a consulta, tá muito extenso esse tipo de consulta!

    Fico no aguardo!

    Valeu!

    • Tipo Alterado Marcos SJ terça-feira, 12 de abril de 2016 11:32
    segunda-feira, 11 de abril de 2016 18:25

Todas as Respostas

  • Boa Tarde,

    Não entendi sua dúvida, mas como no exemplo acima se você estiver utilzando "ou" (or) você pode subtiruir por:
    where Filial IN(@Filial1, @Filial2, @Filial3). Assim por diante.

    Vale ressaltar que isso as vezes pode ser gerado ou otimizado dinamicamente com recursos na linguagem de programação. Por exemplo se seus parâmetros estão em uma lista, pode fazer um "for" e montar o script de forma bem dinâmica.

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    segunda-feira, 11 de abril de 2016 19:04
  • No caso eu também poderia trazer pra uma datagrid somente os valores true de acesso!

    Minha tabela é assim

    Filial 1   Filial 2

    True      False

    assim verifico quem tem permissao em cada filial.

    Quando irei fazer uma consulta eu utilizo where Filial like @Filial1 or Filial like @Filial1, porém são 65 filiais. Existe alguma forma de simplificar isso ?

    Where irá trazer os dados daquela filial se o usuário tiver acesso (true) aquela filial!

    segunda-feira, 11 de abril de 2016 19:36
  • Silvaney, nesse tipo que você passou, "where Filial IN(@Filial1, @Filial2, @Filial3)"

    Ela faz da maneira, por exemplo, se não encontrar a filial 1 ele tenta encontrar a segunda e assim por diante ?

    segunda-feira, 11 de abril de 2016 19:46
  • Fepus, vou te dar uma resposta disso - não da pra fazer de outra forma.

    Veja bem a sua situação; você tem várias colunas que cada uma pode ter um valor.

    Se fosse ao contrário, fosse 1 coluna com vários valores possíveis você poderia fazer o que o Silvaney disse e usar o argumento "WHERE field1 IN (@value1, @value2, @value3)". isso é bastante usado.

    Lógico que cada argumento a mais no WHERE tem um custo na performance, mas no seu caso são 64 colunas a serem testadas e não dá pra não testar uma delas. Se a sua preocupação é com o comprimento do texto que você manda (a consulta SQL) - não se preocupe. Não é o tamanho do seu texto que impacta na performance do SQL.

    Se o SQL tem que testar 64 colunas, o TESTE impacta na performance. Se você tivesse um método mais sucinto de escrever a consulta, mas ainda sim resultasse no mesmo teste o impacto seria o mesmo. Você (programador/DBA) é que estaria escrevendo menos.

    terça-feira, 12 de abril de 2016 12:36
  • Entendo, mas a dica Silvaney é muito boa.

    Sammuel Miranda, talvez eu não tenha sido claro, mas entendi. Eu tenho uma coluna que tem todas as filiais, e em outra tabela tenho tipo de permissões para cada filial, que são no total 64. A minha dúvida seria o seguinte, se não teria outra forma de fazer a consulta sem ter que ta repedindo várias, várias vezes tipo assim abaixo:

    Eu estava fazendo assim:

    WHERE        (DATA_PRODUCAO BETWEEN @dtInicio AND @dtFim) AND (BANCO LIKE @Banco) AND (FILIAL_PROMOTOR LIKE @F1) OR

    (DATA_PRODUCAO BETWEEN @dtInicio AND @dtFim) AND (BANCO LIKE @Banco) AND (FILIAL_PROMOTOR LIKE @F2)

    e assim por diante até 64 filiais (F64), no caso iria ficar uma código muito extenso, e da forma que o Silvaney indicou ficou muito mais compacta.

    E resulto nisso:

    WHERE        (DATA_PRODUCAO BETWEEN @dtInicio AND @dtFim) AND (BANCO LIKE @Banco) AND (FILIAL_PROMOTOR IN (@F1, @F2, @F3, @F4, @F5, @F6, @F7, @F8, @F9... e assim por diante.

    Mas isso resolveu meu problema..

    Outra coisa que pensei em fazer foi, trazer todos os dados da tabela de permissão de cada filial para uma datagridview somente as filiais ativas que tem permissões ativa, por exemplo são 64 filiais, pra não fazer a consulta de todas 64, eu iria trazer para a datagridview só as que estão ativa, vamos supor que tenha 15 filiais que esse usuário tem, então fazia um for i para percorrer e fazia uma consulta junto com o for i pra ir buscar somente as ativas, isso pra não ta consultando filiais que não são necessárias, assim pode até optimizar o tempo da consulta. Será que isso faz alguma diferença ?

    O que vocês acham ?




    • Editado Fepus terça-feira, 12 de abril de 2016 12:53
    terça-feira, 12 de abril de 2016 12:51