none
Case Inner Join ? RRS feed

  • Pregunta

  • Estimados.

    Tengo una tabla que no esta normalizada

    Tengo:

    Select * From A Inner Join B

    On a.id=b.id

    Y

    Select * From A Inner Join B

    On a.id=b.id_new

    En la tabla A tengo una columna que me indica cuando cruzar por ID y cuadno por ID_NEW

    Es posible hacer un case con el Innr Join ? algo como esto ?

    Select * From A Inner Join B

    Case Then A.col='A' Then cruzar por b.id

    Then a.col='B' Then cruzar por b.id_new


    DBA SQL Server Santiago/Chile

    jueves, 3 de marzo de 2016 21:16

Respuestas

  • SELECT * From A Inner Join B
    ON A.id= 
    CASE WHEN A.col='A' THEN = b.id
         WHEN A.col='B' THEN = b.id_new
    END
    
    

    Buenas noches, no comprobe la sintaxis porque estoy desde el telf, pero prueba esto... y dime si te sirve.

    SQL ADICTO Queriendo aprender cada día mas...

    • Propuesto como respuesta charles_sv viernes, 4 de marzo de 2016 0:31
    • Marcado como respuesta CMAPM viernes, 4 de marzo de 2016 14:26
    viernes, 4 de marzo de 2016 0:07

Todas las respuestas

  • SELECT * From A Inner Join B
    ON A.id= 
    CASE WHEN A.col='A' THEN = b.id
         WHEN A.col='B' THEN = b.id_new
    END
    
    

    Buenas noches, no comprobe la sintaxis porque estoy desde el telf, pero prueba esto... y dime si te sirve.

    SQL ADICTO Queriendo aprender cada día mas...

    • Propuesto como respuesta charles_sv viernes, 4 de marzo de 2016 0:31
    • Marcado como respuesta CMAPM viernes, 4 de marzo de 2016 14:26
    viernes, 4 de marzo de 2016 0:07
  • Esta sugerencia pudiera resolver el problema, pero me gustaria ver el plan de ejecucion final. Anticipo que ambas tablas seran recorridas en su totalidad.

    Otra forma seria:

    select * from A inner join B on A.id = B.id where A.col='A'
    union all
    select * from A inner join B on A.id = B.id_new where A.col='B';


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    viernes, 4 de marzo de 2016 15:28
  • Intenté citar el mensaje anterior pero no me lo permiten aun porque no han podido comprobar mi cuenta jejeje

     

    Solo quería decir que estoy totalmente de acuerdo con Hunchback. Sólo el plan de ejecución puede decirnos que tan eficiente es la consulta inicial planteada, en lo personal, creo que me iría por esta ultima que tú has posteado, la del UNION. Ya que con el WHERE desde un inicio ya le estas diciendo con cuales se hará el amarre en el JOIN, sin embargo en la primera opción planteada el motor de la base debe de perder tiempo en evaluar primero con la sentencia CASE si el campo es A o B y hasta despues hacer el JOIN.

    Si tu tabla no tiene muchos registros o tu servidor es un monstruo de servidor probablemente no notes la diferencia de las dos sentencias; pero nunca está demás buscar optimizar las consultas.

    Saludos

    viernes, 4 de marzo de 2016 15:42
  • El eficiente es UNION ALL, es bastante la diferencia.

    Originalmente lo tengo con UNION ALL, la consulta iba para un analista que me porfiaba con el tema del case.

    Miles de gracias.


    DBA SQL Server Santiago/Chile

    viernes, 4 de marzo de 2016 16:03