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?
Respuesta
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.
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
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
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.
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. –
@klausbyskov: Ese *** es *** una unión interna, es simplemente sintaxis ANSI-89. –
Mi mal, cayó en el ejemplo equivocado ... lo arreglé ahora: D –
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.
¿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 =*
.
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
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,
(* = y = *) no solo se está eliminando gradualmente en SQL Server, actualmente no siempre devuelve los resultados correctos. – HLGEM
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.
FYI, 17 años = reemplazado por el estándar SQL ANSI 92 (y 18 años mañana :-) – gbn
- 1. ¿Se pueden implementar manualmente las uniones Cocoa?
- 2. Hibernate/JPA: cómo forzar las uniones implícitas para usar UNIONES EXTERNAS IZQUIERDAS
- 3. ¿Pueden las consultas del servidor sql realmente cancelarse/anularse?
- 4. SQL anexar las consultas
- 5. Django - Consultas SQL sin formato - Lo que sucede en las uniones
- 6. ¿Entiendo mal las uniones?
- 7. ¿Por qué las uniones anónimas no pueden contener miembros con constructores/destructores no triviales?
- 8. Tablas específicas de MS SQL que cuelgan en las consultas
- 9. Servidor SQL: ¿importa el orden de las uniones externas completas?
- 10. Las funciones de SQL no pueden devolver type trigger
- 11. ¿Son seguras las consultas multilínea sql-injection?
- 12. Entender las uniones de Orchard y las relaciones de datos
- 13. Listar las consultas que se ejecutan en SQL Server
- 14. Mide automáticamente todas las consultas SQL
- 15. Enlaces en Riak: ¿qué pueden hacer/no hacer, en comparación con las bases de datos de gráficos?
- 16. Servidor SQL: eliminación de filas con restricciones de clave externa: ¿Pueden las transacciones anular las restricciones?
- 17. ¿Cómo pueden las consultas de django sql usar mayúsculas y minúsculas y contiene al mismo tiempo?
- 18. prueban que pueden inyección SQL
- 19. ¿Cómo se informa al servidor SQL que no se debe usar el caché en las consultas?
- 20. ¿Qué hacer con las consultas que no tienen una representación en un modelo de dominio?
- 21. ¿Qué técnicas genéricas se pueden aplicar para optimizar las consultas SQL?
- 22. ¿Las referencias rvalue permiten conversiones implícitas?
- 23. ¿Qué puede hacer un RDBMS que Neo4j (y las bases de datos de gráficos) no pueden?
- 24. ¿Cómo ver las consultas que hibernan?
- 25. las redes neuronales no pueden descifrar las transformadas de Fourier?
- 26. Monitor de actividad de SQL Server mostrar todas las consultas
- 27. uso de variables en las consultas SQL en asp.net (C#)
- 28. ¿Qué son las Uniones no restringidas propuestas en C++ 11?
- 29. ¿Las uniones discriminadas se refieren entre sí?
- 30. Comprensión de bloqueos de SQL Server en las consultas SELECT
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. –
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? –