none
Código equivalente a un Left Join? RRS feed

  • Question

  • Saludos cordiales,

    Cuando se realizan la intersecciones con las tablas las operaciones incluyen entre otras inner join, left join...

    En el caso de un inner join también se puede lograr uniendo en el where a.clave = b.clave, cierto sin ninguna otra condición.

    Pregunta cuál sería un código equivalente a un Left Join sin utilizar el Left Join? 

    Tuesday, September 13, 2022 7:10 PM

Answers

  • Hola Carlos Ariel Buritica:

    Esa forma de hacer los joins (Ansi 89) esta obsoleta, y el plan de ejecución puede además no ser adecuado.

    Aunque en inglés, esté artículo de Aaron Bertrand te muestra el tema.

    Malos hábitos en los joins

    https://sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins

    Create table tbA (id int primary key, col1 int)
    Create table tbB (id int primary key, descripcion char(1));
    GO
    Insert into tbA (id, col1)
    values
    (1,1),
    (2,1),
    (3,2),
    (4,2),
    (5,null);
    Insert into tbB (id, descripcion)
    values
    (1,'a'),
    (2,'b');
    go

    Con este escenario.

    Cuando haces una query 

    SELECT * 
    FROM tbA, tbB
    Where tbA.col1 = tbB.id

    El plan de ejecución determina que es una operación de inner join. Aunque por la sintaxis es una operación cross join.

    Antes (hasta sql server 2012) se podía hacer algo del estilo

    Where tbA.col1 = tbB.id or tbB.id is null

    Pero sigue siendo un cross join.

    SELECT tbA.*, tbB.* 
    FROM tbA, tbB
    order by tbA.id;

    Es lo mismo que:

    SELECT tbA.*, tbB.* 
    FROM tbA cross join tbB
    order by tbA.id

    Y ya nos indica que cuidado.....

    Wednesday, September 14, 2022 5:08 AM

All replies

  • creo que un equivalente de left join....seria outer apply
    Tuesday, September 13, 2022 9:42 PM
  • Hola Carlos Ariel Buritica:

    Esa forma de hacer los joins (Ansi 89) esta obsoleta, y el plan de ejecución puede además no ser adecuado.

    Aunque en inglés, esté artículo de Aaron Bertrand te muestra el tema.

    Malos hábitos en los joins

    https://sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins

    Create table tbA (id int primary key, col1 int)
    Create table tbB (id int primary key, descripcion char(1));
    GO
    Insert into tbA (id, col1)
    values
    (1,1),
    (2,1),
    (3,2),
    (4,2),
    (5,null);
    Insert into tbB (id, descripcion)
    values
    (1,'a'),
    (2,'b');
    go

    Con este escenario.

    Cuando haces una query 

    SELECT * 
    FROM tbA, tbB
    Where tbA.col1 = tbB.id

    El plan de ejecución determina que es una operación de inner join. Aunque por la sintaxis es una operación cross join.

    Antes (hasta sql server 2012) se podía hacer algo del estilo

    Where tbA.col1 = tbB.id or tbB.id is null

    Pero sigue siendo un cross join.

    SELECT tbA.*, tbB.* 
    FROM tbA, tbB
    order by tbA.id;

    Es lo mismo que:

    SELECT tbA.*, tbB.* 
    FROM tbA cross join tbB
    order by tbA.id

    Y ya nos indica que cuidado.....

    Wednesday, September 14, 2022 5:08 AM
  • Gracias Javi
    Thursday, September 15, 2022 12:37 AM