Diferencia entre left join y *= en Sybase ASE 15

Necesito ayuda para entender este asunto, ¿cuál es la diferencia entre las 2 consultas a continuación, todo lo que sé que ellos no devuelven el mismo resultado.

SELECT a.col1, b.c1
  FROM A a
  LEFT JOIN B b
    ON a.col1 = b.c1
 WHERE b.status = 'Y'

y

SELECT a.col1, b.c1
  FROM A a, B b
 WHERE a.col1 *= b.c1
   AND b.status = 'Y'
¿Tienes una consulta que utiliza *= en la producción? Si no, no te preocupes acerca de esta vieja sintaxis y seguir con la ISO/ANSI-92 JOIN sintaxis de combinaciones.
AFAIR el 2 consultas son exactamente equivalentes: nuevo (1992 ?) la notación en contra de los viejos (pre-1992) notación. el Uso de la nueva notación SÓLO.

OriginalEl autor R Vive L OL | 2012-12-07

5 Kommentare

  1. 6

    La primera consulta:

    SELECT
           a.col1, b.c1 
    FROM 
           a LEFT JOIN b ON a.col1 = b.c1 
    WHERE
           b.status = 'Y' ;

    es equivalente a una combinación interna debido a la b.status columna (desde el lado derecho de una combinación externa izquierda) se utiliza en la WHERE parte:

    SELECT
           a.col1, b.c1 
    FROM 
           a INNER JOIN b ON a.col1 = b.c1 
    WHERE
           b.status = 'Y' ;

    La 2ª consulta es (probablemente) que se ejecuta como:

    SELECT
           a.col1, b.c1 
    FROM 
           a LEFT JOIN b ON a.col1 = b.c1 
                        AND b.status = 'Y' ;

    que puede dar diferentes resultados, ya que es una (lógicamente) diferentes de la consulta.

    Que una de las razones por las que usted debe nunca utilizar esta sintaxis antigua. Es ambigua, a veces, por ejemplo, cuando hay más de uno las condiciones de uno o más combinaciones externas.

    OriginalEl autor ypercubeᵀᴹ

  2. 5

    Sé Sybase y SQL Server están estrechamente relacionados. El *= ha sido retirado de SQL Server, pero incluso tan lejos como SQL Server 2000, no estaba funcionando correctamente, a veces la interpretación, como un left join y a veces como cross join. Desde Sybase y SQL Server vino desde la misma base del producto, sospecharía que esta también es su problema y por qué los resultados son diferentes. No utilice la combinación implícita de una combinación externa como no fiable de dar la respuesta correcta.

    Aquí es una cita directa de los Libros en pantalla de SQL Server 2000 que se trata este problema:

    En versiones anteriores de Microsoft® SQL Server™ 2000, izquierda y derecha
    outer join condiciones especificadas en el WHERE cláusula mediante la *=
    y =* operadores. En algunos casos, esta sintaxis resultados en una ambigua
    consulta que puede ser interpretado en más de una forma. Compatibles con SQL-92
    las combinaciones externas se especifican en el FROM cláusula y no resultado en este
    la ambigüedad.

    OriginalEl autor HLGEM

  3. 3

    Siento ser un poco tarde, pero he encontrado la solución: En la antigua sintaxis *=, la condición b.Status = 'Y' será en el left join en la cláusula, así que para tener el mismo resultado en la primera consulta me acabo de mudar la b.Status = 'Y' a la «a» de la cláusula.

    OriginalEl autor R Vive L OL

  4. 0

    Estas consultas tienen el mismo aspecto. Te dicen que no devuelven el mismo resultado. ¿Tiene usted un ejemplo?

    Donde el antiguo y el nuevo unirse a las anotaciones de los diferencian es que si usted se mudó de donde la combinación

    Select
      a.col1, 
      b.c1
    From
      A
        Left Join
      B 
        On a.col1 = b.c1 And b.Status = 'Y';

    Esto es diferente, y no puede ser tan fácilmente representados en la antigua notación (al menos no en la de Oracle, no tengo experiencia directa de Sybase)

    Ejemplo (aunque Oracle utiliza (+) en lugar de *=)

    OriginalEl autor Laurence

  5. 0

    Traté de encontrar la conversión de las antiguas consultas nuevas consultas cuando hay más de 2 tablas con muchas cláusulas where, pero no podía encontrar en cualquier lugar en línea, por lo tanto la publicación de mi solución aquí. El resultado será exactamente partido en caso de que usted siga el truco a continuación:

    En caso de que por debajo de consulta:

        select a.*
        from A a, B b, C c
        where a.server_id=0
        and a.name = 'John'
        and a.country_id*=b.value_cd
        and b.table_nm = 'Employee'
        and b.Attribute_nm ='A_nm'
        and a.state_id*= c.value_cd
        and c.table_nm = 'Company'

    Todos, donde las condiciones excepto para la primera tabla (es decir, la Tabla a) puede ir en la cláusula en unirse, sin embargo, en la condición con la primera tabla debe permanecer en la cláusula where, como en el siguiente consulta:

        select a.*
        from A a
        left join B b on a.country_id = b.value_cd 
           and b.table_nm = 'Employee' 
           and b.Attribute_nm ='A_nm'
        left join C c on a.state_id = c.value_cd 
           and c.table_nm = 'Company' 
        where a.server_id=0
           and a.name = 'John'

    OriginalEl autor Prakriti

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea