sql >> Base de Datos >  >> RDS >> Mysql

Límite práctico a la longitud de la consulta SQL (específicamente MySQL)

Leer tu consulta me da ganas de jugar un juego de rol.

Esto definitivamente no es demasiado largo. Mientras estén bien formateados, diría que un límite práctico es de unas 100 líneas. Después de eso, es mejor dividir las subconsultas en vistas solo para evitar que se crucen los ojos.

He trabajado con algunas consultas que tienen más de 1000 líneas y eso es difícil de depurar.

Por cierto, ¿puedo sugerir una versión reformateada? Esto es principalmente para demostrar la importancia del formato; Confío en que esto será más fácil de entender.

select *  
from
  4e_magic_items mi
 ,4e_magic_item_levels mil
 ,4e_monster_sources ms
where mi.id = mil.itemid
  and mi.source = ms.id
  and itemlevel between 1 and 30
  and source not in(16,2,5,13,15,3,4,12,7,14,11,10,8,1,6,9)  
  and type not in(
                  'Arms' ,'Feet' ,'Hands' ,'Head' ,'Neck' ,'Orb' ,
                  'Potion' ,'Ring' ,'Rod' ,'Staff' ,'Symbol' ,'Waist' ,
                  'Wand' ,'Wondrous Item' ,'Alchemical Item' ,'Elixir' ,
                  'Reagent' ,'Whetstone' ,'Other Consumable' ,'Companion' ,
                  'Mount'
                 )
  and ((type != 'Armor') or (false))
  and ((type != 'Weapon') or (false))
order by
  type asc
 ,itemlevel asc
 ,name asc

/*
Some thoughts:
==============
0 - Formatting really matters, in SQL even more than most languages.
1 - consider selecting only the columns you need, not "*"
2 - use of table aliases makes it short & clear ("MI", "MIL" in my example)
3 - joins in the WHERE clause will un-clutter your FROM clause
4 - use NOT IN for long lists
5 - logically, the last two lines can be added to the "type not in" section.
    I'm not sure why you have the "or false", but I'll assume some good reason
    and leave them here.
*/