Autor Tema: Problema de logica  (Leído 7192 veces)

0 Usuarios y 1 Visitante están viendo este tema.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Problema de logica
« en: Noviembre 22, 2012, 08:40:14 pm »
Buenas, estaba migrando unos SP de MS Sql 2000 a 2008 y me tope con lo siguiente

Los arme aca a los SP pero son simplemente como ejemplo.

SP Original

Código: [Seleccionar]
Select *
from table
where
   table.id =* table1.id
   and table1.value = 12

SP migrado

Código: [Seleccionar]
Select *
from table right join table1 on table.id = table1.id

where
   table1.value = 12

Bueno, para mi sorpresa el SP migrado esta mal, la condicion que deje en el where tendria que estar arriba en el join para que de el mismo resultado... ahora lo que me gustaria saber es, Cual es la logica de esto, yo asumi que primero se hacie el join y luego se filtraba lo que estaba en el where pero aparentemente el join evalua todas las condiciones en el SP original.

Alguno me podria guiar un poco por favor?

Gracias.

Edite el primer SP que me comi un AND
« última modificación: Noviembre 22, 2012, 09:58:06 pm por cobein »

ssccaann43

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Problema de logica
« Respuesta #1 en: Noviembre 23, 2012, 09:52:34 am »
A ver, presumo que esto ha sido un error de tipeo, despues del igual hay un asterisco...!
Código: [Seleccionar]
Select *
from table
where
   table.id =* table1.id
   and table1.value = 12

En todo caso, la consulta correcta sería:

Código: [Seleccionar]
Select *
from table inner join table1 on table.id = table1.id
where
   table1.value = 12

Lo que no entiendo es la razón por la cual el SQL Server te toma el Right.

Y ciertamente la condición donde el valor = 12 lo hace correctamente despues del join...!
Miguel Núñez.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Problema de logica
« Respuesta #2 en: Noviembre 23, 2012, 09:59:58 am »
Hola scan aca tengo el ejemplo en concreto, esta el original, el migrado que no funciona y el que esta correcto. Ahora lo que no entiendo es porque el segundo no funciona, cual es la logica?

Con respecto al asterisco es un right join =*

Código: [Seleccionar]
-- Original
-----------------------------------

SELECT  txt_desc ,
        sn_habilitado ,
        ISNULL(cnt_meses, 0) ,
        ISNULL(pje_coeficiente, 0) ,
        tcrid.cod_coeficiente ,
        tcri.cod_moneda ,
        tcri.cod_ramo
FROM    tcoef_reserva_incobrabilidad tcri ,
        tcoef_reserva_incobrabilidad_def tcrid
WHERE   tcrid.cod_coeficiente *= tcri.cod_coeficiente
        AND tcri.cod_ramo = 12
        AND tcri.cod_moneda = 0
ORDER BY tcri.cod_coeficiente


-- No funciona
---------------------------

SELECT  txt_desc ,
        sn_habilitado ,
        ISNULL(cnt_meses, 0) ,
        ISNULL(pje_coeficiente, 0) ,
        tcrid.cod_coeficiente ,
        tcri.cod_moneda ,
        tcri.cod_ramo
FROM    tcoef_reserva_incobrabilidad tcri
        RIGHT JOIN tcoef_reserva_incobrabilidad_def tcrid ON tcrid.cod_coeficiente = tcri.cod_coeficiente
WHERE   tcri.cod_ramo = 12
        AND tcri.cod_moneda = 0
ORDER BY tcri.cod_coeficiente

-- Funciona
---------------------------

SELECT  txt_desc ,
        sn_habilitado ,
        ISNULL(cnt_meses, 0) ,
        ISNULL(pje_coeficiente, 0) ,
        tcrid.cod_coeficiente ,
        tcri.cod_moneda ,
        tcri.cod_ramo
FROM    tcoef_reserva_incobrabilidad tcri
        RIGHT JOIN tcoef_reserva_incobrabilidad_def tcrid ON tcrid.cod_coeficiente = tcri.cod_coeficiente
                                                             AND tcri.cod_ramo = 12
                                                             AND tcri.cod_moneda = 0
--where
ORDER BY tcri.cod_coeficiente
« última modificación: Noviembre 23, 2012, 10:02:55 am por cobein »

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Problema de logica
« Respuesta #3 en: Noviembre 27, 2012, 05:57:48 pm »
Perdon que bumpee el tema pero quedo en el olvido y aun tengo la duda.

ssccaann43

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Problema de logica
« Respuesta #4 en: Noviembre 27, 2012, 06:03:42 pm »
A ver Cobein, me parece super extraño eso, debería funcionar... Realmente no se que pueda estar pasando...!
Miguel Núñez.

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Problema de logica
« Respuesta #5 en: Noviembre 27, 2012, 07:21:31 pm »
cobein mirate este tema:

INNER JOIN ON vs WHERE clause

ahi hablan del porque poner las condiciones en el where y porque no.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Problema de logica
« Respuesta #6 en: Noviembre 27, 2012, 07:49:43 pm »
Perdón el off-topic (¿Con que estará hecho ese foro?. Se parece al mio que esta hecho con Vanilla pero hay cosas que no tengo y por eso mi duda) Sorry por la desvirtuada.
Me encuentras en YAcosta.com

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Problema de logica
« Respuesta #7 en: Noviembre 27, 2012, 08:46:00 pm »
Gracias Seba, entiendo eso, lo que no logro comprender es:

En el segundo ejemplo se hace un join y posteriormente se aplica el filtro que esta en el where, en el tercer y primer ejemplo se hace un join con todas las condiciones, basicamente esa es la diferencia. Ahora mi pregunta es, para ser mas concreto, en el primer ejemplo sintacticamente como hago para saber donde termina el JOIN? ahora se por los test que abarca todo pero sintacticamente es imposible saber lo que esta pasando. Por logica yo hice el segundo ejemplo pero resulto ser que estaba mal y no se como detectar estas cosas de manera sintactica sin tener que correr las consultas una por una.

Espero que se entienda lo que digo.

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Problema de logica
« Respuesta #8 en: Noviembre 27, 2012, 09:30:18 pm »
Gracias Seba, entiendo eso, lo que no logro comprender es:

En el segundo ejemplo se hace un join y posteriormente se aplica el filtro que esta en el where, en el tercer y primer ejemplo se hace un join con todas las condiciones, basicamente esa es la diferencia. Ahora mi pregunta es, para ser mas concreto, en el primer ejemplo sintacticamente como hago para saber donde termina el JOIN? ahora se por los test que abarca todo pero sintacticamente es imposible saber lo que esta pasando. Por logica yo hice el segundo ejemplo pero resulto ser que estaba mal y no se como detectar estas cosas de manera sintactica sin tener que correr las consultas una por una.

Espero que se entienda lo que digo.

no se me ocurre nada  8)

por las dudas probaste ejecutar esas consultas en el plan de ejecucion del sql server ? este te analiza el query y te dice las partes que consumieron mas de forma grafica, es muy bueno, ahi te dice si una consulta con las condiciones en el JOIN son mas pesadas que las condiciones en el WHERE, y lo mejor es que podes ejecutar 2 consultas y te las compara, yo siempre la uso para optimizar consultas, capas hasta te detecte las condiciones en el where o en el join.

hace mucho tuve que hacer una consulta algo compleja y me acuerdo que le tenia que poner la condicion en el JOIN, porque en el WHERE no me daba pelota, nunca supe porque.

Perdón el off-topic (¿Con que estará hecho ese foro?. Se parece al mio que esta hecho con Vanilla pero hay cosas que no tengo y por eso mi duda) Sorry por la desvirtuada.

al parecer se llama OSQA, mira la pagina oficial:

OSQA
« última modificación: Noviembre 27, 2012, 09:40:39 pm por seba123neo »

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Problema de logica
« Respuesta #9 en: Noviembre 27, 2012, 09:34:42 pm »
Perdón el off-topic (¿Con que estará hecho ese foro?. Se parece al mio que esta hecho con Vanilla pero hay cosas que no tengo y por eso mi duda) Sorry por la desvirtuada.

al parecer se llama OSQA, mira la pagina oficial:

OSQA

Lo máximo Sebas, me pase una hora buscando y buscando y nada. Debo aprender mas. Muchas gracias.!!!
Me encuentras en YAcosta.com