2009-12-30 14 views
5

Nunca he aprendido cómo funcionan las uniones, solo uso select y la cláusula where ha sido suficiente para todas las consultas que he hecho. ¿Hay casos en los que no puedo obtener los resultados correctos usando la cláusula WHERE y tengo que usar un JOIN? Si es así, ¿podría alguien dar ejemplos? Gracias.¿Las consultas que las uniones implícitas de SQL no pueden hacer?

+2

La respuesta más simple es: debe aprender acerca de las UNIONES. En muchos casos, harán su vida más fácil, incluso si hay otra forma de escribir su consulta. –

+1

Ahora, una muy buena cosa para usted sería aprender a aceptar las respuestas dadas a sus preguntas que parezcan correctas. Siento que las respuestas no son las que usted necesita, ya sea que comenten las respuestas dadas o coloquen una recompensa. MK? –

Respuesta

3

Sí. Al hacer uniones externas. Puede leer this simple article en las uniones. Las uniones no son difíciles de entender, por lo que debe comenzar a aprender (y usarlas cuando corresponda) de inmediato.

+0

No estoy seguro de por qué esto obtuvo un resultado negativo. La respuesta está muerta ........ las combinaciones implícitas son 'internas' por defecto. Entonces, es muy probable que el asker necesite entender los diferentes tipos de unión. – tyshock

+0

Hoy parece ser un día negativo. He visto varias preguntas y respuestas modificadas hoy con otras personas publicando comentarios de "por qué se modificó esto". – jeffa00

0

Cada vez que desee combinar los resultados de dos tablas, deberá unirlas. Tomemos, por ejemplo:

tabla Usuarios:

ID 
FirstName 
LastName 
UserName 
Password 

y direcciones de tabla:

ID 
UserID 
AddressType (residential, business, shipping, billing, etc) 
Line1 
Line2 
City 
State 
Zip 

donde un solo usuario podría tener su casa y su dirección comercial que aparece (o un envío y una dirección de facturación), o ninguna dirección en absoluto. El uso de una cláusula simple WHERE no captará a un usuario sin direcciones porque las direcciones están en una tabla diferente. Con el fin de ir a buscar direcciones de un usuario ahora, tendrá que hacer una unión como:

SELECT * 
FROM Users 
LEFT OUTER JOIN Addresses 
    ON Users.ID = Addresses.UserID 
WHERE Users.UserName = "foo" 

Ver http://www.w3schools.com/Sql/sql_join.asp por un poco más en la definición de la profundidad de las diferentes Uniones y cómo funcionan.

+0

No tiene que usar 'unión interna'. Puede escribirlo como 'select users. * From users, addresses where users.id = addresses.userid y users.username = "foo" '. Pero ese no es el caso para las uniones externas, como se indica en mi respuesta a continuación. –

+1

@klausbyskov: Ese *** es *** una unión interna, es simplemente sintaxis ANSI-89. –

+0

Mi mal, cayó en el ejemplo equivocado ... lo arreglé ahora: D –

0

La sintaxis de unión implícita usa por defecto uniones internas. A veces es posible modificar la sintaxis de unión implícita para especificar uniones externas, pero depende del proveedor en mi experiencia (sé que Oracle tiene la notación (-) y (+), y creo que sqlserver usa * =). Entonces, creo que su pregunta puede reducirse a la comprensión de las diferencias entre las uniones internas y externas.

Podemos ver un ejemplo sencillo para un interno vs combinación externa mediante una simple consulta ..........

El INTERIOR implícita de Ingreso:

select a.*, b.* 
from table a, table b 
where a.id = b.id; 

La consulta anterior traerá SÓLO filas donde la fila 'a' tiene una fila correspondiente en 'b' para su campo 'id'.

La EXTERIOR explícita JOIN:

select * from 
table a LEFT OUTER JOIN table b 
on a.id = b.id; 

La consulta anterior nos traerá cada fila en una, si tiene o no tiene una fila coincidente en 'b'. Si no existe coincidencia para 'b', los campos 'b' serán nulos.

En este caso, si quisiera traer CADA fila en 'a' independientemente de si tenía una fila 'b' correspondiente, necesitaría usar la unión externa.

Como dije, dependiendo del proveedor de su base de datos, aún puede utilizar la sintaxis de unión implícita y especificar un tipo de combinación externa. Sin embargo, esto lo vincula con ese proveedor. Además, cualquier desarrollador que no esté familiarizado con esa sintaxis especializada puede tener dificultades para entender su consulta.

2

¿Hay casos en los que no puedo obtener los resultados correctos usando la cláusula WHERE y tengo que usar un JOIN?

Cada vez que su consulta involucre dos o más tablas, se usa una unión. This link es ideal para mostrar las diferencias en las uniones con imágenes, así como en los conjuntos de resultados de muestra.

Si el criterio de unión está en la cláusula WHERE, entonces se usa la sintaxis ANSI-89 JOIN. El motivo de la sintaxis JOIN más nueva en el formato ANSI-92 es que hizo que LEFT JOIN sea más consistente en varias bases de datos. Por ejemplo, Oracle usó (+) en el lado que era opcional, mientras que en SQL Server tenía que usar =*.

+0

Y la sintaxis de unión implícita en SQl Server ya no es válida e incluso en versiones anteriores, dio resultados incorrectos ya que a veces se interpretaba como una combinación externa y, a veces, como una combinación cruzada. – HLGEM

0

Usando Combinaciones:

SELECT a.MainID, b.SubValue AS SubValue1, b.SubDesc AS SubDesc1, c.SubValue AS SubValue2, c.SubDesc AS SubDesc2 
FROM MainTable AS a 
LEFT JOIN SubValues AS b ON a.MainID = b.MainID AND b.SubTypeID = 1 
LEFT JOIN SubValues AS c ON a.MainID = c.MainID AND b.SubTypeID = 2 

con la mano izquierda, no veo una manera de conseguir los mismos resultados que los que mediante el uso de un simple cláusula WHERE para unir las tablas. Además, la sintaxis comúnmente utilizada en las cláusulas WHERE para hacer uniones izquierda y derecha (* = y = *) está siendo eliminada,

+0

(* = y = *) no solo se está eliminando gradualmente en SQL Server, actualmente no siempre devuelve los resultados correctos. – HLGEM

7

Las uniones implícitas tienen más de 20 años de vigencia. ¿Por qué siquiera considerarías escribir código con ellos?

Sí, pueden crear problemas que las uniones explícitas no tienen. Hablando de SQL Server, las sintaxis implícitas de la unión izquierda y derecha no garantizan la devolución de los resultados correctos. A veces, devuelven una unión cruzada en lugar de una combinación externa. Esto es algo malo. Esto fue cierto incluso al menos hasta SQL Server 2000, y están siendo eliminados, por lo que su uso es una práctica deficiente.

El otro problema con las uniones implícitas es que es fácil hacer una combinación cruzada accidentalmente al olvidar una de las condiciones de lugar, especialmente cuando se unen demasiadas tablas. Mediante el uso de combinaciones explícitas, obtendrá un error de sintaxis si olvida poner una condición de unión y una combinación cruzada debe especificarse explícitamente como tal. De nuevo, esto da como resultado consultas que devuelven valores incorrectos o se corrigen utilizando distinct para deshacerse de la combinación cruzada que, en el mejor de los casos, es ineficaz.

Además, si tiene una combinación cruzada, el desarrollador de mantenimiento que aparece en un año para realizar un cambio no sabe si fue intencionado o no cuando utiliza combinaciones implícitas.

Creo que algunos ORM ahora también requieren combinaciones explícitas.

Además, si utiliza combinaciones implícitas porque no comprende cómo funcionan las uniones, es muy probable que esté escribiendo código que, de hecho, no devuelve el resultado correcto porque no sabe cómo evaluar cuál sería el resultado correcto ya que no entiendes lo que una unión debe hacer.

Si escribe código SQL de cualquier sabor, no hay excusa para no entender las uniones.

+0

FYI, 17 años = reemplazado por el estándar SQL ANSI 92 (y 18 años mañana :-) – gbn

Cuestiones relacionadas