Pregunta

La semana pasada me sorprendió descubrir que sybase 12 no admite combinaciones externas.Pero se me ocurrió que una combinación externa completa debe ser el mismo como una combinación externa izquierda unir con una combinación externa derecha de la misma sql.¿Alguien puede pensar en una razón por la que este no es verdad?

¿Fue útil?

Solución

UNION-ing dos declaraciones OUTER JOIN debería resultar en filas duplicadas que representan los datos que se obtendría de una INNER JOIN. Habría que hacer probablemente un SELECT DISTINCT en el conjunto de datos producido por el UNION. En general, si usted tiene que utilizar un SELECT DISTINCT que significa que no es una consulta bien diseñado (o por lo que he oído).

Otros consejos

Si la unión con UNION ALL, obtendrá duplicados. Si sólo utiliza UNION sin la ALL, se filtra duplicados y, por tanto, sea equivalente a una unión completa, pero la consulta también será mucho más caro porque tiene que llevar a cabo una especie distinta.

UNION ALL la izquierda se unan a la derecha se unen, pero limitar el derecho de unirse a sólo las filas que no existen en la tabla de base (volver nula en la unión cuando no serían nulas en la tabla si existieran).

Para que este código que se necesitan para crear dos tablas t1 y t2. t1 debe tener una columna llamada c1 con cinco filas que contienen los valores de 1-5. t2 también debe tener una columna c1 con cinco filas que contiene los valores 2-6.

completa combinación externa:

select * from t1 full outer join t2 on t1.c1=t2.c1 order by 1, 2;

completa combinación externa equivalente:

select t1.c1, t2.c1 from t1 left join  t2 on t1.c1=t2.c1
union all
select t1.c1, t2.c1 from t1 right join t2 on t1.c1=t2.c1 
where t1.c1 is null
order by 1, 2;

Tenga en cuenta la cláusula where se unió a la derecha de selección que limita los resultados a sólo aquellos que no sería duplicados.

  1. Bueno, en primer lugar, no sé por qué se está utilizando 12.x.Fue EndOfLifed el 31 de diciembre de 2009, después de haber sido notificado el 3 de Abr de 2007.15.0.2 (primera versión sólida) salió en enero de 2009.15.5 es mucho mejor y estaba disponible 02 Dic 2009, por lo que son dos versiones principales, y de por lo menos 13 meses, fuera de la fecha.

  2. ASE 12.5.4 tiene la nueva sintaxis de Join.(no se han especificado, usted puede estar en 12.5.0.3, la liberación antes de eso).

  3. DB2 y Sybase no aplicar FULL OUTER JOIN, precisamente por la razón de haber identificado:es cubierto por LEFT ... UNION ... RIGHT sin ALL.No es un caso de "no apoyar" un FOJ;se trata de un caso de la palabra clave es la que falta.

  4. Y luego tiene el problema que Sybase, DB2 y los de tipo general que no uso externo se une a dejar solos FOJs, debido a que sus bases de datos tienden a ser más normalizado, etc.

  5. Por último, cabe perfectamente normal de SQL se puede utilizar en cualquier versión de Sybase, que proveerá de la función de FOJ, y será claramente más rápido en 12.x;sólo marginalmente más rápido en 15.x.Es algo así como el RANGO() función:totalmente innecesario si usted puede escribir una Subconsulta.

  6. La segunda razón por la que no necesita FULL OUTER, como algunos de la gama baja de los motores, es debido a que el nuevo optimizador de conversiones es extremadamente rápido, y la consulta es totalmente normalizada.Es decir.se realiza la IZQUIERDA y la DERECHA en un solo paso.

  7. Dependiendo de SARGs y el Tipo de datos desajustes, etc es posible que aún tenga a sort-merge, pero que también se transmite en los tres niveles:disco subsistema de e/S;motor(s);y el controlador de red.Si las tablas están particiones, es además parallelised en ese nivel.

  8. Si su servidor no está configurado y el conjunto de resultados es muy grande, puede ser necesario aumentar proc cache size y number of sort buffers.Eso es todo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top