utilizar uso usar tambien signos reglas rae puntuacion punto los lleva las ejemplos cómo cuándo como comas coma sql sql-server database tsql select

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 =*



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.