sql - usar - uso de la coma rae
¿Cuál es la diferencia entre usar una combinación cruzada y poner una coma entre las dos tablas? (7)
A los comentarios sobre la utilidad de las combinaciones cruzadas, hay un ejemplo muy útil y válido de usar combinaciones cruzadas o comas en el mundo ciertamente oscuro de Postgres generate_series y Postgis spatial sql donde puede usar una combinación cruzada contra generate_series para extraer el enésima geometría de una colección de geometría o multi- (polígono / punto / cadena lineal), ver: http://postgis.refractions.net/documentation/manual-1.4/ST_GeometryN.html
SELECT n, ST_AsEWKT(ST_GeometryN(the_geom, n)) As geomewkt
FROM (
VALUES (ST_GeomFromEWKT(''MULTIPOINT(1 2 7, 3 4 7, 5 6 7, 8 9 10)'') ),
( ST_GeomFromEWKT(''MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))'') )
) As foo(the_geom)
CROSS JOIN generate_series(1,100) n
WHERE n <= ST_NumGeometries(the_geom);
Esto puede ser muy útil si desea obtener el área, centroide, cuadro delimitador u otras operaciones que puede realizar en una sola geometría, cuando se encuentran dentro de una más grande.
Siempre escribí tales consultas usando una coma antes de generar_serie, hasta que un día me pregunté si esto realmente significaba unirse cruzado, lo que me trajo a esta publicación. Oscuro, pero definitivamente útil.
Cuál es la diferencia entre
select * from A, B
y
select * from A cross join B
? Parecen devolver los mismos resultados.
¿La segunda versión es preferible a la primera? Es la primera versión completamente sintácticamente incorrecta?
Devuelven los mismos resultados porque son semánticamente idénticos. Esta:
select *
from A, B
... es (mueca) la sintaxis ANSI-89. Sin una cláusula WHERE para vincular las tablas, el resultado es un producto cartesiano. Que es exactamente lo que ofrece la alternativa también:
select *
from A
cross join B
... pero CROSS JOIN es la sintaxis ANSI-92.
Sobre el rendimiento
No hay diferencia de rendimiento entre ellos.
¿Por qué usar ANSI-92?
El motivo para usar la sintaxis ANSI-92 es para compatibilidad con OUTER JOIN (IE: LEFT, FULL, RIGHT) - La sintaxis ANSI-89 no tiene ninguna, por lo que muchas bases de datos implementaron las suyas propias (que no se transfieren a ninguna otra base de datos ) IE: Oracle''s (+)
, SQL Server''s =*
Estos son ejemplos de combinaciones cruzadas implícitas y explícitas. Ver http://en.wikipedia.org/wiki/Join_%28SQL%29#Cross_join .
La primera versión fue originalmente la única forma de unir dos tablas. Pero tiene una serie de problemas, por lo que la palabra clave JOIN se agregó en el estándar ANSI-92. Dan los mismos resultados, pero el segundo es más explícito y es preferible.
Para agregar a las respuestas ya dadas:
select * from A, B
Esta era la única forma de unirse antes del estándar SQL de 1992. Entonces, si quisieras una unión interna, tendrías que usar la cláusula WHERE
para los criterios:
select * from A, B
where A.x = B.y;
Un problema con esta sintaxis era que no había un estándar para las uniones externas. Otra fue que esto se vuelve ilegible con muchas tablas y, por lo tanto, es propenso a errores y menos sostenible.
select * from A, B, C, D
where B.id = C.id_b
and C.id_d = D.id;
Aquí tenemos una combinación cruzada de A con B / C / D. ¿A propósito o no? Tal vez el programador simplemente olvidó el and B.id = A.id_b
(o lo que sea), o tal vez esta línea fue eliminada por error, y tal vez todavía estaba destinado a ser una combinación cruzada. ¿Quién podría decir?
Aquí es lo mismo con combinaciones explícitas
select *
from A
cross join B
inner join C on C.id_b = B.id
inner join D on D.id = C.id_d;
Ya no hay dudas sobre las intenciones de los programadores.
La vieja sintaxis separada por comas fue reemplazada por buenas razones y ya no debería usarse.
Son lo mismo y deberían (casi) nunca usarse.
Tropecé con esta publicación de otra pregunta de SO, pero una gran diferencia es la vinculación de unión cruzada crea. Por ejemplo, al usar cross apply
u otra unión después de B
en la primera variante (''coma''), la aplicación de cruz o unión solo se referiría a la (s) tabla (s) después del punto. por ejemplo, lo siguiente:
select * from A, B join C on C.SomeField = A.SomeField and C.SomeField = B.SomeField
crearía un error:
El identificador de varias partes "A.SomeField" no se pudo enlazar.
porque el join en C solo alcanza B, mientras que lo mismo con cross join ...
select * from A cross join B join C on C.SomeField = A.SomeField and C.SomeField = B.SomeField
..es considerado bueno. Lo mismo se aplicaría si se usa la cross apply
. Por ejemplo, al aplicar una cruz se aplica a una función después de B
, la función solo podría usar campos de B, donde la misma consulta con combinación cruzada, podría usar campos de A y B. Por supuesto, esto también significa que el reverso puede usarse como bien. Si desea agregar una combinación únicamente para una de las tablas, puede lograrlo yendo ''coma'' en las tablas.