Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: Miseryk en 27 Noviembre 2014, 18:49 pm



Título: [AYUDA] SQL Query
Publicado por: Miseryk en 27 Noviembre 2014, 18:49 pm
Buenas tardes a todos, no sé si realmente ésto va acá o en Programación General, bueno mi cuestión es la siguiente:

Yo tengo una consulta como por ejemplo Select * From tbNombres;

La cual me puede traer muchos nombres, como "Pepe", "Juan", etc. El punto es que si quiero filtrar ciertos nombres como Pepes, Juan y otros más, que el query no se me haga de 5 renglones, ya que actualmente estoy usándolo de la siguiente manera:

Código
  1. SELECT * FROM tbNombres WHERE Name!='Pepe' AND Name!='Juan' AND Name!='Carlos' AND Name!='Luis' AND Name!='Alberto' AND Name!='Horacio' AND Name!='Tito' AND Name!='Marito' AND Name!='Oscar' AND Name!='Julieta' AND Name!='Florencia' AND Name!='Rocatalegiata' AND Name!='Raul' AND ...
  2.  

Es decir que tengo una tabla con miles de nombres y no quiero que me traiga unos 200 determinados, tal vez esté haciendo mal el query, lo cual es probable porque no sé programar en SQL, alguno me podría orientar?

Desde ya muchas gracias, sigo buscando mientras (Y)


Título: Re: [AYUDA] SQL Query
Publicado por: HdM en 27 Noviembre 2014, 21:45 pm
Para acortar code podrías usar WHERE name NOT IN (). Podrías crearte una tabla auxiliar que contenga todos los nombres que no quieres (sería más fácil de mantener que no tener que estar tocando los fuentes sin parar) y luego descartarlos con una subconsulta. Un ejemplo por si te sirve:

http://www.java2s.com/Tutorial/MySQL/0040__Select-Query/UsingNOTINwithsubquery.htm (http://www.java2s.com/Tutorial/MySQL/0040__Select-Query/UsingNOTINwithsubquery.htm)

EDIT: ¿qué tienen en común todos esos nombres para que quieras excluirlos? ¿algún valor en algún campo? Igual lo estás complicando demasiado y es suficiente con filtrar por ese campo.

Saludos.



Título: Re: [AYUDA] SQL Query
Publicado por: Miseryk en 28 Noviembre 2014, 13:22 pm
Para acortar code podrías usar WHERE name NOT IN (). Podrías crearte una tabla auxiliar que contenga todos los nombres que no quieres (sería más fácil de mantener que no tener que estar tocando los fuentes sin parar) y luego descartarlos con una subconsulta. Un ejemplo por si te sirve:

http://www.java2s.com/Tutorial/MySQL/0040__Select-Query/UsingNOTINwithsubquery.htm (http://www.java2s.com/Tutorial/MySQL/0040__Select-Query/UsingNOTINwithsubquery.htm)

EDIT: ¿qué tienen en común todos esos nombres para que quieras excluirlos? ¿algún valor en algún campo? Igual lo estás complicando demasiado y es suficiente con filtrar por ese campo.

Saludos.



El tema es que no puedo crear tablas, en realidad dí un ejemplo básico para que se tenga una idea, pero realmente es un hook en windows y patcheo un query, entonces con el tema de la memoria quería limitar la longitud y de paso entender como optimizarlo.

Por lo que estuve viendo el NOT IN necesita un query adentro como SELECT, se puede hacer algo como:

Código
  1. ... WHERE Name NOT IN ('Pepe', 'Juan' ....)???
  2.  

Saludos.


Título: Re: [AYUDA] SQL Query
Publicado por: Miseryk en 28 Noviembre 2014, 14:29 pm
Bueno, por los pocos ejemplos que encontré era de la manera la cual pregunté, aunque al SO no le gusta y explota, pero bueno ahora sé como se puede optimizar, gracias (Y)

Saludos.


Título: Re: [AYUDA] SQL Query
Publicado por: Shell Root en 28 Noviembre 2014, 15:26 pm
Puedes crear tablas temporales, tiene vida sólo en la ejecución de un bloque de código:

  • Crear tabla temporal.
  • Insertar registros desde un archivo tipo .csv a la tabla temporal. (Con los registros que no quieras mostrar)
  • Ejecutar una query SELECT ... FROM ... WHERE ... NOT IN (SELECT ... FROM ... WHERE ...)

En código sería algo como:
Código
  1. -- Crear tabla temporal
  2. CRATE TABLE #tmpNotIn(Nombre VARCHAR(50) NOT NULL);
  3. GO
  4.  
  5. -- Llenar tabla temporal con los registros que no quieras mostrar
  6. -- Formato del archivo sería:
  7. --
  8. -- Filename = NotIn.csv
  9. --
  10. --    [A]
  11. -- [1] USUARIO
  12. -- [2] Raul
  13. -- [3] Pepe
  14. -- [4] Juan
  15. -- [5] Carlos
  16. -- [6] ...etc...
  17.  
  18. -- FIRSTROW # Fila desde donde empieza a ingresar, para no tomar el titulo de USUARIO
  19. -- ROWTERMINATOR # Delimitador de terminación de registro para pasar al proximo
  20. BULK INSERT #tmpNotIn FROM 'PATH_FILE' WITH (FIRSTROW = 2, ROWTERMINATOR = '\n' )
  21. GO
  22.  
  23. -- Selección de datos
  24. SELECT * FROM tblUsuario WHERE Nombre NOT IN (SELECT Nombre FROM #tmpNotIn)

PD1: No tengo SQL en este momento para probar si esta bien el código que te dejo, lo hice de memoria puede estar con errores.
PD2: además puedes utilizar procedimiento almacenados