2009-09-15 32 views
57

Estoy tratando de rastrear algunos SQL en el servidor de Microsoft. Encontré una unión que usa una convención desconocida para mí. ¿Qué significa "=*"?¿Qué significa = *?

WHERE table1.yr =* table2.yr -1 
+47

significa: ¡reescríbame con la nueva sintaxis sql! –

+5

Si eres lo suficientemente mayor como para recordar la sintaxis ... –

+31

te está enviando un beso –

Respuesta

71

Este:

WHERE t.column =* s.column 

... es antigua sintaxis de unión externa de TSQL (pre SQL Server 2005), y no es ANSI JOIN.

Referencia: SQL Server 2005 Outer Join Gotcha

+10

Técnicamente, es pre SQL Server 7. – Dave

+1

Además, a partir de SQL Server 2012, no hay forma de que pueda usar esta sintaxis, ya que han caído Versión 80 Modo de compatibilidad. Esto es bueno. –

16

Esta es la sintaxis de estilo antiguo para expresar une

+2

Alguien está hambriento de representante ... –

+2

@victor hugo Todavía soy un novato en esto, por favor sé amable. Honestamente, alineé primero esta, simplemente tratando de ayudar. La parte graciosa, y descubrí esto accidentalmente, es que obtenemos más representantes para estos no-brainers que para preguntas mucho más difíciles. Por cierto, ¿por qué me molestaría en esto, en comparación con los que respondieron más tarde con una membresía de representante superior/SO más larga? – mjv

+0

@mjv: Creo que Vitor me estaba tomando el pelo en realidad. –

25

creo que es vieja sintaxis que indica una condición de combinación externa de tabla1 a TABLA2

viejo estilo:

SELECT * FROM table1, table2 
WHERE table1.yr =* table2.yr -1 

Nueva estilo (SQL92):

SELECT * FROM table2 
LEFT OUTER JOIN table1 ON table1.yr = table2.yr - 1 
+2

En realidad, tu ejemplo no es el correcto. Si realmente quieres usar una combinación externa izquierda, sería SELECCIONAR * DESDE ** tabla2 ** SALIR OUTER EXTERIOR ** table1 ** ON table1.yr = table2.yr-1 – Turismo

+0

@Turismo - ¡buena captura! edité mi respuesta para corregir eso. –

1

A ??? la unión externa se especifica con el símbolo = * en lugar de = en la cláusula WHERE.

+0

Deje de votar hacia abajo, la estrella a la DERECHA significa que este lado puede contener nulos. Es IZQUIERDA combinación externa. – alex

+0

La pregunta "¿* = a IZQUIERDA o DERECHA combinación externa" no puede ser contestada, porque se puede escribir ya sea de A, B ON Ac * = Bc o de A, B ON * Bc = Ac Mismo operador (* =), pero uno es una combinación externa IZQUIERDA y uno es una combinación externa DERECHA. Sin embargo, creo que estás equivocado, y el * va del lado de la columna de la mesa exterior, no de la mesa interior. La moraleja del argumento es que esta es una sintaxis horrible. Me gusta más la respuesta de HLGEM. –

+0

Puedo decirte que realmente lo intenté (y era difícil escribir esa sintaxis, estremecer) que * = es la combinación de la izquierda. Gracias por las lindas palabras de Steve. – HLGEM

2

Este es el antiguo estilo de combinaciones que estaban en desuso en ANSI SQL92. Nueva sintaxis utiliza interior y exterior UNEN que se unen tablas basado en expresiones en lugar de la igualdad

0

yeap, es otra sintaxis de una combinación externa izquierda

 
from 
table1 left outer join table2 on table1.yr = table2.yr - 1 
+0

y también es otra sintaxis para una combinación externa derecha : de tabla2 unión externa derecha table1 en table1.yr = table2.yr - 1 –

6

Esa es la sintaxis de 1.989 ANSI SQL para RIGHT OUTER JOIN, donde * = sería el LEFT OUTER JOIN.

También debe tener en cuenta que poner la sintaxis de unión en la cláusula WHERE está en desuso en SQL 2008. http://scarydba.wordpress.com/2009/09/15/no-join-predicate/ < == Un artículo oportuno sobre esto.

11

¡Significa que el código debe ser reemplazado inmediatamente! Se supone que esta unión de estilo es una combinación correcta. Desafortunadamente, a veces se interpretará como una combinación cruzada, por lo que los resultados del uso de esta unión pueden no ser correctos. Además, esta sintaxis está en desuso y no se puede usar en la próxima versión del servidor SQl.

+4

A quien sea que haya votado negativamente esto, dije esto porque el código actual es incorrecto por cualquier estándar, ya que los resultados correctos no se pueden garantizar incluso desde SQL Server 2000. Incluso afirma que este código tiene resultados inconsistentes en los Libros en pantalla para SQL Server 2000.Dejarlo es que la base del código sería arriesgada y poco profesional. – HLGEM

-1

Aquí hay muchas respuestas tontas. No dio la cláusula FROM, por lo que no hay forma de saber si su * = representa una combinación externa IZQUIERDA o DERECHA.

WHERE table1.yr =* table2.yr -1 

es sintaxis antigua para una unión externa, sin duda. Pero cualquiera que diga saber si es una combinación externa IZQUIERDA o DERECHA está equivocada. Depende del orden en que se nombran table1 y table2 en la cláusula FROM, y eso no se da.

+0

No. El * indica qué tabla se conserva, por lo que en este ejemplo se conserva table2. – JosephStyons

+0

Sí, la tabla 2 se conserva. No dije lo contrario. Pero aún no puedes decirme si esta es una unión IZQUIERDA o una DERECHA, ¿o sí? –

+0

En la sintaxis antigua, generalmente se utiliza la condición de unión para determinar qué tabla se considera IZQUIERDA y cuál es DERECHA. El orden en la cláusula FROM no es relevante. – Turismo

0
SELECT * 
FROM table1, table2 
WHERE table1.yr =* table2.yr -1 

significa lo mismo como esto:

SELECT * 
    FROM 
    table2 
    LEFT OUTER JOIN 
    table1 
    ON table1.yr = (table2.yr - 1) 

The * syntax is considered outdated, y no está en consonancia con las normas ANSI.

Oracle has a similar construct así:

WHERE table1.yr (+)= table2.yr 
+1

En realidad, la sintaxis de Oracle es al revés. El (+) está en el lado de la mesa interior (u opcional), pero la estrella está en el lado de la mesa exterior. Entonces table1.yr = * table2.yr sería table1.yr (+) = table2.yr – Turismo

+0

sí, tiene toda la razón. ¡Gracias! – JosephStyons

0

Para ser claro y simple. Este es un operador de combinación externa SQL-92 (more info)

No lo use, es muy antiguo, pero es similar a LEFT JOIN y RIGHT JOIN. Todo lo que hace es decir qué lado de la unión es el lado "Principal", por lo que las filas de ese lado se considerarán primero.

Si intenta ejecutar esto en SQL 2005, arrojará un error, diciendo que necesita ejecutar esto en modo compatibilidad.