• Lunes 29 de Abril de 2024, 03:31

Autor Tema:  Problema En Sentencia Sql  (Leído 4210 veces)

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Problema En Sentencia Sql
« en: Miércoles 9 de Abril de 2008, 02:28 »
0
Muy buenas a la presente, saludos

Acudo a la practica más profesional o de mayor conocimiento de SQLs de los presentes para saber si me podria ayudar sobre una SQL que estoy haciendo y de la cual tengo una duda.

Tengo esta SQL:
SELECT  tmp_clientes.nombres, tmp_clientes.apellidos,
   tmp_clientes.nombres, tmp_clientes.apellidos,
   zonas.descripcion,
   clientes.nombres, clientes.apellidos, clientes.direccion1, clientes.telefonos,
   pedidos.id_pedido, pedidos.situacion
FROM tmp_clientes, clientes, zonas, pedidos
WHERE tmp_clientes.cedula=pedidos.id_consultor
AND clientes.cedula=pedidos.id_cliente
AND id_zona='0261' AND id_zona='0264' AND id_zona='0265'
AND pedidos.fechacreacion BETWEEN '01/01/2006' AND '10/04/2008'
AND pedidos.situacion=2

Le falta un poquito en el filtrado, otras cosas, pero ya asi como esta, tengo un problema...

Como se ve, tengo repetido tmp_clientes.nombres y tmp_clientes.apellidos
Eso es porque de una misma tabla debo tomar a dos tipos de personas

Persona 1: Consultor Empresario
Persona 2: Consultor Standar

El problema en esto es que como hago para que al correr el query, pueda tener en la consulta, en una columna al ConsultorEmpresario, y en otra columna al ConsultorStandar, ya que en el filtrado, el campo para validar a ambos, es el mismo.
Si esto es Leído por accidente, induzca al vomito

Mollense

  • Miembro de PLATA
  • *****
  • Mensajes: 1755
  • Nacionalidad: ar
    • Ver Perfil
    • http://solocodigo.com/
Re: Problema En Sentencia Sql
« Respuesta #1 en: Miércoles 9 de Abril de 2008, 03:34 »
0
Podés usar un alias para la tabla, ej:

Si tu tabla se llamara "Personas" -->

Código: Text
  1. SELECT ConsultorEmpresario.nombre, ConsultorEmpresario.apellido, ConsultorStandar.nombre, ConsultorStandar.apellido FROM dbo.Personas AS ConsultorEmpresario,  dbo.Personas AS ConsultorStandar
  2.  

Obviamente, al repetirse los nombres de los campos, deberías también colocarle alias a estos, de lo contrario saldrías de la forma "Expr1", "Expr2", etc.

PD: A vuelo de pájaro me llamó la atención esta parte del WHERE:
Código: Text
  1. id_zona='0261' AND id_zona='0264' AND id_zona='0265'
  2.  
Eso es como decir: Quiero que me des un auto siempre y cuando la marca sea Audi "Y" Mercedes Benz "Y" Aston Martin. La condición nunca se cumple.

Un saludo
"Los que renuncian son más numerosos que los que fracasan" H.F.
"No se cómo sería la III Guerra Mundial, pero la cuarta sería con piedras" A.E.
"Quién no fía no es de fiar..."


...no te quedes mirando.

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Problema En Sentencia Sql
« Respuesta #2 en: Miércoles 9 de Abril de 2008, 17:02 »
0
Citar
PD: A vuelo de pájaro me llamó la atención esta parte del WHERE:

CODE 
id_zona='0261' AND id_zona='0264' AND id_zona='0265'


Eso es como decir: Quiero que me des un auto siempre y cuando la marca sea Audi "Y" Mercedes Benz "Y" Aston Martin. La condición nunca se cumple.

Colocarle Alias a las Tablas y a los Campos ya lo habia tratado, pero no sirve, me repite al Empresario y al Consultor como la misma persona, de ahi esto del problema de sacar a dos personas de una misma tabla.

Quite lo de id_zona='0261'.... etc.. ya que efectivamente la SQL no trae nada con eso, al quitarlo si trae y es cuando veo la repeticion de lo comentado. Pero yo necesito filtrar la informacion por Zona, solo los registros de determinadas regiones (ciudades).

Habia pensado algo que si funcioa en Access, una SQL Padre y otras sub SQLs dentro, algo asi como:

SELECT TablaA.camposX, ...
     (Select campos From TablaB Where TablaA.campo=TablaB.campo) AS CampoY
FROM TablaA, TablaC
WHERE TablaA.campo=TablaC.campo... etc.

Pero SQL Server no lo acepta.

No sabria como proceder con esto, help! :(
Si esto es Leído por accidente, induzca al vomito

Mollense

  • Miembro de PLATA
  • *****
  • Mensajes: 1755
  • Nacionalidad: ar
    • Ver Perfil
    • http://solocodigo.com/
Re: Problema En Sentencia Sql
« Respuesta #3 en: Miércoles 9 de Abril de 2008, 17:37 »
0
Si, claro que se repiten, es que faltaría el Join o un WHERE. Ej:

Si La tabla Personas tuviera un campo "IdPersona" -->

Código: Text
  1. SELECT ConsultorEmpresario.nombre, ConsultorEmpresario.apellido, ConsultorStandar.nombre, ConsultorStandar.apellido FROM dbo.Personas AS ConsultorEmpresario,  dbo.Personas AS ConsultorStandar WHERE ConsultorEmpresario.IdPersona=1 AND ConsultorStandar.IdPersona=2
  2.  

Eso solamente traería un registro (Si es que existieran esos códigos de personas), con el nombre y apellido del registro uno y el nombre y apellido del registro dos.

Espero que se entienda

Un saludo
"Los que renuncian son más numerosos que los que fracasan" H.F.
"No se cómo sería la III Guerra Mundial, pero la cuarta sería con piedras" A.E.
"Quién no fía no es de fiar..."


...no te quedes mirando.

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Problema En Sentencia Sql
« Respuesta #4 en: Miércoles 9 de Abril de 2008, 17:38 »
0
Cita de: "UserCode"
Habia pensado algo que si funcioa en Access, una SQL Padre y otras sub SQLs dentro, algo asi como:

SELECT TablaA.camposX, ...
     (Select campos From TablaB Where TablaA.campo=TablaB.campo) AS CampoY
FROM TablaA, TablaC
WHERE TablaA.campo=TablaC.campo... etc.

Pero SQL Server no lo acepta.

No sabria como proceder con esto, help! :(
Que version de SQL Server?

porque si procesa subconsultas, recuerda que las subconsultas no debe retornar mas de 1 fila, ni mas de una columna, puedes usar Top si son repetidos los registros

Código: Text
  1. SELECT TablaA.camposX, ...
  2.      (Select top 1 campo From TablaB Where TablaA.campo=TablaB.campo) AS CampoY
  3. FROM TablaA, TablaC
  4. WHERE TablaA.campo=TablaC.campo
  5.  

procura usar columnas indexadas para las relaciones

Si las tablas son muy grandes, las subconsultas se van haciendo menos eficientes seria mejor usar Joins


Puedes poner un ejemplo de tus tablas? y el resultado que esperas obtener con el query para tener una idea mas clara del problema


Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Problema En Sentencia Sql
« Respuesta #5 en: Miércoles 9 de Abril de 2008, 21:56 »
0
Citar
SELECT  EMP.nombres AS 'Nombres Empresario', EMP.apellidos AS 'Apellidos Empresario',
   CONSULT.nombres AS 'Nombres Consultor', CONSULT.apellidos AS 'Apellidos Consultor',
   Z.descripcion AS 'Descripcion',
   CLI.nombres AS 'Nombres Cliente', CLI.apellidos AS 'Apellidos Cliente',
   CLI.direccion1 AS 'Direccion Cliente', CLI.telefonos AS 'Telefonos Cliente',
   P.id_pedido AS '# Pedido', P.situacion AS 'Situacion'
FROM tmp_clientes AS EMP, tmp_clientes AS CONSULT, clientes AS CLI, zonas AS Z, pedidos AS P
WHERE EMP.cedula=P.id_consultor AND CONSULT.cedula=P.id_consultor
AND CLI.cedula=P.id_cliente
AND Z.id_zona='0261' AND Z.id_zonas='0264' AND Z.id_zonas='0265'
AND P.fechacreacion BETWEEN '01/01/2006' AND '10/04/2008'
AND P.situacion=2

Si quito esto:
AND Z.id_zona='0261' AND Z.id_zonas='0264' AND Z.id_zonas='0265'
Si trae datos, pero necesito validar esas 3 regiones porque solo me interesan registros de esos id_zona.

Citar
Que version de SQL Server?

porque si procesa subconsultas, recuerda que las subconsultas no debe retornar mas de 1 fila, ni mas de una columna, puedes usar Top si son repetidos los registros

SQL Server 2000, se me escapo el que la subsql solo puede traer una fila, entonces la subsql no me sirve :(

Estuve viendo unas SQL de Inner Join, etc en internet pero me he enrredado para saber bien donde poner mi Join en toda esta SQL, cambiando el Where para traer la data de mejor forma.
Si esto es Leído por accidente, induzca al vomito

Mollense

  • Miembro de PLATA
  • *****
  • Mensajes: 1755
  • Nacionalidad: ar
    • Ver Perfil
    • http://solocodigo.com/
Re: Problema En Sentencia Sql
« Respuesta #6 en: Miércoles 9 de Abril de 2008, 23:22 »
0
Código: Text
  1. Si quito esto:
  2. AND Z.id_zona='0261' AND Z.id_zonas='0264' AND Z.id_zonas='0265'
  3. Si trae datos, pero necesito validar esas 3 regiones porque solo me interesan registros de esos id_zona.
  4.  
Entonces utiliza "OR" (Este "o" este "o" este otro)
"Los que renuncian son más numerosos que los que fracasan" H.F.
"No se cómo sería la III Guerra Mundial, pero la cuarta sería con piedras" A.E.
"Quién no fía no es de fiar..."


...no te quedes mirando.

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Problema En Sentencia Sql
« Respuesta #7 en: Jueves 10 de Abril de 2008, 02:19 »
0
Citar
SELECT  EMP.nombres AS 'Nombres Empresario', EMP.apellidos AS 'Apellidos Empresario',
   CONSULT.nombres AS 'Nombres Consultor', CONSULT.apellidos AS 'Apellidos Consultor',
   Z.descripcion AS 'Descripcion',
   CLI.nombres AS 'Nombres Cliente', CLI.apellidos AS 'Apellidos Cliente',
   CLI.direccion1 AS 'Direccion Cliente', CLI.telefonos AS 'Telefonos Cliente',
   P.id_pedido AS '# Pedido', P.situacion AS 'Situacion'
FROM tmp_clientes AS EMP, tmp_clientes AS CONSULT, clientes AS CLI, zonas AS Z, pedidos AS P
WHERE EMP.cedula=P.id_consultor AND EMP.tipo_str_prm=2
AND CONSULT.cedula=P.id_consultor AND CONSULT.tipo_str_prm=1
AND CLI.cedula=P.id_cliente
AND Z.id_zona='0261' OR Z.id_zona='0264' OR Z.id_zona='0265'
AND P.fechacreacion BETWEEN '01/01/2006' AND '10/04/2008'
AND P.situacion=2 AND P.cont_cred<>3

Al correr la SQL nunca termina, ya que la deje corriendo por 2 hrs y 37 minutos, casi 3 horas y nunca arrojo datos. Poner screen de las tablas, no se si sirva ya que son varias pero tienen muchos campos de los cuales solo busco los ya expuestos en la sql :(
Si esto es Leído por accidente, induzca al vomito

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Problema En Sentencia Sql
« Respuesta #8 en: Jueves 10 de Abril de 2008, 08:07 »
0
Bueno...

creo que el termino las sql y las subsql no es correcto :P (query o colsulta, subquery o subconsulta)


Yo creo que si pusieras un ejemplo de las estructuras de tus tablas y algunos datos de ejemplo asi como el resultado que esperas de esa consulta



asi pudieramos ayudarte un poco mas


Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Problema En Sentencia Sql
« Respuesta #9 en: Jueves 10 de Abril de 2008, 15:54 »
0
Si, procedere a hacer capturas de pantalla de la estructura de las tablas, pero sera luego, tal vez en la noche, porque donde normalmente estoy la conexion podria no ser muy buena y no tanto eso, sino que sera trabajoso y algo largo realizar esos screenshot ya que serian muchas imagenes, pero de hacerlo, lo haria hoy mismo antes de terminar el dia.

 :comp:
Si esto es Leído por accidente, induzca al vomito

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Problema En Sentencia Sql
« Respuesta #10 en: Jueves 10 de Abril de 2008, 16:34 »
0
Antes de lo comentado, de en la noche en casa hacer los screen probe algo nuevo.
Como debo de sacar a dos personas de una misma tabla, probe Exportar esa tabla, hacer una copia de esta a la misma BD con otro nombre, teniendo de esa forma dos tablas:

tmp_clientes y tmp_clientes2

Quedando esto asi:

Código: Text
  1.  
  2. SELECT  tmp_clientes.nombres, tmp_clientes.apellidos,
  3.   tmp_clientes2.nombres, tmp_clientes2.apellidos,
  4.   zonas.descripcion,
  5.   clientes.nombres, clientes.apellidos, clientes.direccion1, clientes.telefonos,
  6.   pedidos.id_pedido, pedidos.situacion
  7. FROM tmp_clientes, tmp_clientes2, clientes, zonas, pedidos, tga
  8. WHERE tmp_clientes.cedula=pedidos.id_consultor AND tmp_clientes.tipo_str_prm=2
  9. AND tmp_clientes.tga=tga.tga AND tmp_clientes.id_clientecli=tga.id_clientecli
  10. AND tmp_clientes2.cedula=pedidos.id_consultor AND tmp_clientes2.tipo_str_prm=1
  11. AND tmp_clientes2.tga=tga.tga AND tmp_clientes2.id_clientecli=tga.id_clientecli
  12. AND clientes.cedula=pedidos.id_cliente
  13. AND zonas.id_zona='0261' OR zonas.id_zona='0264' OR zonas.id_zona='0265'
  14. AND pedidos.fechacreacion BETWEEN '01/01/2006' AND '10/04/2008'
  15. AND pedidos.situacion=2 AND pedidos.cont_cred&#60;&#62;3
  16.  
  17.  

Pero no me trae nada :(
procedere a los screen como comente, en lo que pueda pongo los screen.
Si esto es Leído por accidente, induzca al vomito

UserCode

  • Miembro MUY activo
  • ***
  • Mensajes: 338
    • Ver Perfil
Re: Problema En Sentencia Sql
« Respuesta #11 en: Viernes 11 de Abril de 2008, 03:37 »
0
Ya furula, sabia que debia revisar bien todo lo del Where  :)

SELECT tmp_clientes2.nombres, tmp_clientes2.apellidos,
       tmp_clientes.nombres, tmp_clientes.apellidos,
       zonas.descripcion,
       clientes.nombres, clientes.apellidos, clientes.direccion1, clientes.telefonos,
       pedidos.id_pedido, pedidos.situacion
FROM tmp_clientes, tmp_clientes2, clientes, zonas, pedidos, tga
WHERE clientes.cedula = pedidos.id_cliente AND
   clientes.id_zona = zonas.id_zona AND
   tmp_clientes.cedula = pedidos.id_consultor AND
   tmp_clientes.tga = tga.tga AND
   tmp_clientes2.id_clientecli=tga.id_clientecli AND
   pedidos.fechacreacion >= '01/01/2006' AND pedidos.fechacreacion <='10/04/2008' AND
   (zonas.id_zona='0261' OR zonas.id_zona='0264' OR zonas.id_zona='0265') AND
   pedidos.situacion=2 AND pedidos.cont_cred<>3

Muchisimas gracias muchachos por el enorme apoyo ante este terrible problema del cual andaba desde hace un par de dias. Profesionales como los presentes no se ven en cualquier parte.  Cuidense  :hola:
Si esto es Leído por accidente, induzca al vomito