2011-06-07 18 views
20

Tengo una consulta que extraje de ms sql 2000 y se enchufa en una consulta MySql. No funcionó, MySql se ahogaría con el operador * =. En este ejemplo, tengo dos columnas varchar llamadas person_name.¿Qué es este operando (* = star-igual) en SQL Server 2000?

SELECT * FROM tbl1 a, tbl2 b 
WHERE a.id = b.id 
AND a.person_name *= b.person_name 

Sé que en otros idiomas myInt * = myTotal también podría leerse como myInt * myInt = myTotal. Sin embargo, estoy trabajando con varchar que contienen todos los caracteres, sin enteros. Lo escribí como:

AND a.person_name * a.person_name = b.person_name 

Voila! Parece que funcionó. ¿Alguien puede explicar lo que está sucediendo? ¿El operador * = convierte los caracteres a sus equivalentes enteros o? ¿Y por qué no podría encontrar este operador en algún lugar de la web?

+0

¿Son esos campos de cadena/char? Me pregunto cuál sería el razonamiento detrás de la multiplicación de cadenas. –

+1

Sí, son campos varchar. Me estaba haciendo la misma pregunta: "¿Por qué demonios multiplicas dos cuerdas?" –

+1

Y si todavía está utilizando la base de datos del servidor SQl 2000, todas las instancias de = * o * = deben corregirse a uniones izquierdas o uniones hacia la derecha ya que la unión implícita está rota incluso en el servidor SQl 2000 y NO puede devolver los resultados correctos. en algún momento interpretado como una combinación cruzada. Las combinaciones implícitas nunca se deben usar para las uniones externas en SQl Server. – HLGEM

Respuesta

20

En SQL 2000, este fue utilizado como una combinación externa izquierda

= * es un RIGHT OUTER JOIN

Su consulta podría ser:

SELECT 
    * 
FROM 
    tbl1 a LEFT OUTER JOIN tbl2 b ON a.person_name = b.person_name 
WHERE 
    a.id = b.id 

Como se dijo here:

Especifica una combinación externa que utiliza la sintaxis específica del producto no estándar y la cláusula WHERE. El operador * = se usa para especificar una unión externa izquierda y el operador = * se usa para especificar una combinación externa derecha.

+0

Eso es algo que no me enseñaron en la escuela. Implementé tu sugerencia y funcionó. ¡Muchas gracias! –

+0

Sí, es algo que me tocó muchas veces cuando cambié los informes diseñados en SQL 2000. – CristiC

+1

Esta publicación fue hace bastante tiempo, pero pensé que sería bueno mencionarla aquí. La consulta es un ejemplo de un error clásico cuando se trata de LEFT OUTER JOIN. Debido a la cláusula WHERE a.id = b.id, esto en realidad se convierte en una UNIÓN INTERNA. Para una verdadera UNIÓN EXTERIOR IZQUIERDA, la cláusula WHERE debe moverse hacia la UNIÓN EXTERIOR IZQUIERDA como: IZQUIERDA UNIÓN EXTERIOR ... a.nombre_personal = b.nombre_personal Y a.id = b.id – umphy

4

En MSSQL, la * = convención en la cláusula WHERE indica una unión. Entonces, lo que realmente está viendo es una UNIÓN EXTERIOR IZQUIERDA entre tbl1 y tbl2 en person_name donde se devolverán todos los valores de tbl1 y los valores coincidentes en tbl2.

Cuestiones relacionadas