Cómo hacer una combinación externa completa sin tener full outer join disponible

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?

  • Lo que ocurrió cuando intentó que?
  • Llegué a lo que parecía ser el derecho de los datos, pero un caso de prueba no necesariamente responder a la pregunta completamente.
InformationsquelleAutor stu | 2010-01-18

4 Kommentare

  1. 1

    UNION-ción de dos OUTER JOIN declaraciones de resultado en las filas duplicadas en representación de los datos que te dan de una INNER JOIN. Tendrías que hacer probablemente un SELECT DISTINCT en el conjunto de datos producidos por el UNION. Por lo general, si usted tiene que utilizar un SELECT DISTINCT que significa que no es un bien diseñado consulta (o eso he oído).

    • hace más de lo que se requiere aquí; sólo excluye ALL. Sí, si usted tiene que utilizar DISTINCT o OUTER JOIN que es un signo seguro de que hay algo mal; con la base de datos de diseño, no el código.
  2. 1

    Si usted unión con UNION ALL, obtendrás duplicados. Si usted sólo tiene que utilizar UNION sin la ALL, filtrará los duplicados y, por tanto, equivalente a un total de unirse, pero la consulta también será mucho más caro debido a que se tiene que realizar un distinto tipo.

    • Mucho más caro que el de la unión de todos o mucho más caro que un nativo full outer join?
    • Ambos. A pesar de que un nativo full join es técnicamente lo mismo que un UNION, motores de base de datos que soporte completo une tendrá una forma de optimizarlo. Habiendo dicho eso – completa las combinaciones son todavía bastante lento y vale la pena evitar, si se puede. No creo que nunca usarlos.
    • Aaronaught. Eso no es correcto. Sybase ASE 12 de ordenación para este propósito es extremadamente rápida, utiliza interna de las mesas de trabajo y ordenación de los buffers. La empresa de clase motores son muy diferentes a los freeware.
    • Yo no uso el término «freeware», por lo que yo no lo sé. Y no dije que era lento, me dijo que era mucho más caro que UNION ALL, lo cual es cierto. UNION ALL es simplemente la concatenación, que es prácticamente el conjunto más barato de la operación que usted puede hacer.
    • Tengo 20 años de Sybase y no han oído hablar de la terminología antes, yo estaba en ascuas. Lo siento. Claro, un UNION tiene un paso adicional a través de una UNION ALL, pero Sybase hace una combinación Hash mientras que la transmisión de los datos, así que no es «mucho más caro», sólo un poco. Que naturalmente resulta en un menor número de filas, sino que el procesamiento tiene que ser hecho en algún momento del proceso; el único comando SQL es probablemente la mejor ubicación. Yo nunca use combinaciones externas de ningún tipo.
  3. 1

    UNION ALL la izquierda unirse con el derecho de unirse, pero limitar el derecho de unirse a sólo las filas que no existen en la tabla base (return null en la combinación cuando ellos no sería null en la tabla si es que las hubo).

    De este código será necesario crear dos tablas t1 y t2. t1 debe tener una columna denominada c1 con cinco filas que contienen los valores 1-5. t2 también debe tener una columna c1 con cinco filas que contienen los valores 2-6.

    Full Outer Join:

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

    Combinación Externa Completa 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;

    Nota la cláusula where de la derecha se unió a seleccionar que limita los resultados a aquellos que no serían duplicados.

    • 1) no Se puede poner un valor NULL en una columna not NULL, el código no funcionará 2) Este es el código de oracle, no tenemos dual o row_ids en Sybase.
    • 1) yo pensaba que lo que había dicho; no me había dado cuenta que estaban exponiendo la definición de una combinación Externa que stu obviamente entiende (consulte su post). Despejado 2) Retire el ALL ( como se detalla en otras 2 respuestas) y la WHERE cláusula. En primer lugar se incluye a los incautos; luego de excluir los incautos; es más barato y más directo a abstenerse de selección de los incautos, en primer lugar, mediante la exclusión de la ALL, entonces el WHERE no es necesario.
    • La eliminación de la ALL es específicamente para que la UNION puede eliminar los duplicados. Mi versión es la eliminación de los duplicados antes de la UNION ALL, mientras que el UNION versiones de la eliminación de ellos en el UNION. Puede que tengas razón, que más tarde puede ser más barato dependiendo del conjunto de datos; sin tener en cuenta que esta solución es válida todavía.
    • De acuerdo a las preguntas más frecuentes, se nos anima a corregir & mejorar la respuesta. Sybase pregunta. Se hace la eliminación de los incautos durante el UNION. Yo no voto hacia abajo. Veo tu propósito ahora. Vale la pena probar volver más barato.
    • En efecto, gracias por animarme a corregir/mejorar esta respuesta. Puede que no sea la mejor solución, pero al menos es una solución a considerar.
  4. 0
    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 implementar 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; es un caso de la palabra clave es la que falta.

    4. Y, a continuación, usted tiene el problema de 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. Último, no es 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 los de 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; el artefacto(s); y la red de controlador. 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.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea