Cómo: |
Los comandos de join y join condicional de WebFOCUS incluyen la opción FULL OUTER.
Los join externos completos devuelven todas las filas del origen de datos original y del origen de destino. Cuando no existen valores para las filas en ninguno de los orígenes de datos, se devuelven valores nulos. WebFOCUS sustituye los valores por defecto en la salida del informe (espacios en blanco para columnas alfanuméricas, símbolo NODATA para columnas numéricas).
Sólo se puede usar el join externo completo con orígenes de datos relacionales compatibles, cuya sintaxis de join WebFOCUS ha sido optimizada (traducida a la sintaxis de join externo completo SQL compatible con el RDBMS). Si emplea esta sintaxis con orígenes de datos incompatibles o no optimiza la solicitud para el motor, recibirá un mensaje de error.
La siguiente sintaxis genera un equijoin basado en campos reales:
JOIN FULL_OUTER hfld1 [AND hfld2 ...] IN table1 [TAG tag1] TO {UNIQUE|MULTIPLE} cfld [AND cfld2 ...] IN table2 [TAG tag2] [AS joinname] END
donde:
Es el nombre de un campo en la tabla host, que contiene valores compartidos con un campo en la tabla de referencia cruzada. A este campo se le refiere como el campo host.
Puede ser un campo adicional en la tabla host. Se requiere la frase que comienza con AND al especificar campos múltiples.
Es el nombre de la tabla host.
Es un nombre de etiqueta de hasta 66 caracteres (normalmente, el nombre del archivo máster), que se utiliza como un calificador único para campos y alias en la tabla host.
El nombre de la etiqueta para la tabla host debe ser el mismo en todos los comandos JOIN de una estructura unida.
Es el nombre de un campo en la tabla de referencia cruzada que contiene valores coincidentes con los de hfld1 (o de campos host concatenados). A este campo se le refiere como el campo de referencia cruzada.
Nota: UNIQUE sólo devuelve una copia y si no hay una que coincida en la tabla de referencia cruzada, devuelve valores nulos.
Utilice el parámetro MULTIPLE cuando crfld1 puede tener instancias múltiples en común con un valor en hfld1. Fíjese que se trata de un sinónimo de MULTIPLE y la completa omisión de este parámetro es sinónimo de UNIQUE.
Es el nombre de un campo en la tabla de referencia cruzada con valores en común con hfld2.
Nota: crfld2 puede estar cualificado. Este campo sólo está disponible para adaptadores compatibles con joins multicampo.
Es el nombre de la tabla de referencia cruzada.
Es un nombre de etiqueta de hasta 66 caracteres (normalmente, el nombre del archivo máster), que se utiliza como un calificador único para campos y alias en tablas de referencia cruzada. En una estructura de join recurrente, si no se provee el nombre de etiqueta, todos los nombres de campo y alias se prefijan con los primeros cuatro caracteres del nombre de join.
El nombre de la etiqueta para la tabla host debe ser el mismo en todos los comandos JOIN de una estructura unida.
Es un nombre opcional de hasta ocho caracteres que puede asignar a la estructura de join. Debe asignar un nombre único a una estructura de join si:
Nota: Si no asigna un nombre a la estructura de join con la frase AS, se supone que el nombre está en blanco. Una join sin un nombre sobrescribe una join existente sin un nombre.
Obligatorio cuando el comando JOIN ocupa más de una línea. Finaliza el comando y debe ocupar su propia línea.
La siguiente sintaxis genera un join externo completo basado en DEFINE:
JOIN FULL_OUTER deffld WITH host_field ... IN table1 [TAG tag1] TO [UNIQUE|MULTIPLE] cr_field IN table2 [TAG tag2] [AS joinname] END
donde:
Es el nombre de un campo virtual para el archivo host (el campo host). Se puede definir el campo virtual en el archivo máster o con un comando DEFINE.
Es el nombre de cualquier campo real en el segmento host con el que desea asociar el campo virtual. Esta asociación es necesaria para localizar el campo virtual.
La frase WITH es obligatoria a no ser que el parámetro KEEPDEFINES está activado y deffld se definió antes de emitir el comando JOIN.
Para determinar cuál segmento contiene el campo virtual, utilice la consulta ? DEFINE después de emitir el comando DEFINE.
Es el nombre de la tabla host.
Es un nombre de etiqueta de hasta 66 caracteres (normalmente, el nombre del archivo máster), que se utiliza como un calificador único para campos y alias en tablas host.
El nombre de la etiqueta para la tabla host debe ser el mismo en todos los comandos JOIN de una estructura unida.
Es el nombre de un campo real en la tabla de referencia cruzada cuyos valores coinciden con los del campo virtual. Esto debe ser un campo real declarado en el archivo máster.
Nota: UNIQUE sólo devuelve una copia y si no hay una que coincida en la tabla de referencia cruzada, devuelve valores nulos.
Utilice el parámetro MULTIPLE cuando crfld1 puede tener instancias múltiples en común con un valor en hfld1. Fíjese que se trata de un sinónimo de MULTIPLE y la completa omisión de este parámetro es sinónimo de UNIQUE.
Es el nombre de la tabla de referencia cruzada.
Es un nombre de etiqueta de hasta 66 caracteres (normalmente, el nombre del archivo máster), que se utiliza como un calificador único para campos y alias en tablas de referencia cruzada. En una estructura de join recurrente, si no se provee el nombre de etiqueta, todos los nombres de campo y alias se prefijan con los primeros cuatro caracteres del nombre de join.
El nombre de etiqueta del archivo host debe ser el mismo en todos los comandos JOIN de una estructura de join.
Es un nombre opcional de hasta ocho caracteres que puede asignar a la estructura unida. Debe asignar un nombre único a una estructura de join si:
Si no asigna un nombre a la estructura de join con la frase AS, se supone que el nombre está en blanco. Una join sin un nombre sobrescribe una join existente sin un nombre.
Obligatorio cuando el comando JOIN ocupa más de una línea. Finaliza el comando y debe ocupar su propia línea.
La siguiente sintaxis genera un join externo completo condicional:
JOIN FULL_OUTER FILE table1 AT hfld1 [WITH hfld2] [TAG tag1] TO {UNIQUE|MULTIPLE} FILE table2 AT crfld [TAG tag2] [AS joinname] [WHERE expression1; [WHERE expression2; ...] END
donde:
Es el archivo máster del host.
Enlaza el segmento principal o host correcto con el segmento secundario o de referencia cruzada. Los valores de campo utilizados como parámetro AT no se emplean para causar el enlace. Se usan como referencias de segmento.
Es el nombre del campo en el archivo máster host cuyo segmento quedará unido a la tabla de referencia cruzada. El nombre de campo debe estar al menor nivel de segmento en su origen de datos que se ha mencionado.
Es el nombre de etiqueta opcional que se utiliza como calificador único para campos y alias en la tabla host.
Es una columna de tabla con la que se asocia un JOIN condicional basado en DEFINE. En un join condicional basado en DEFINE, el ajuste KEEPDEFINES debe estar activado y se deben crear los campos virtuales antes de emitir el comando JOIN.
Especifica una relación de uno a varios entre table1 y table2. Fíjese que ALL es sinónimo de MULTIPLE.
Especifica una relación de uno a uno entre table1 y table2. Tenga en cuenta que ONE es sinónimo de UNIQUE.
Nota: El join establecido con UNIQUE sólo devuelve una copia de la tabla de referencia cruzada; si la copia no coincide de acorde a la evaluación de la expresión WHERE, los valores devueltos son nulos.
Es el archivo máster de referencia cruzada.
Es el nombre del campo join del archivo máster de referencia cruzada. Puede ser cualquier campo en el segmento.
Es el nombre de etiqueta opcional que se utiliza como calificador único en campos y alias en la tabla de referencia cruzada.
Es el nombre asociado a la estructura join.
Cualquier expresión aceptable en un comando DEFINE FILE. Todos los campos utilizados en las expresiones deben estar en una ruta individual.
El uso del comando END es obligatorio para finalizar el comando y debe ocupar una línea para sí solo.
La siguiente solicitud genera dos tablas Microsoft SQL Server que van a quedar unidas y, a continuación, genera una solicitud en base al join. Las tablas se generan utilizando el ejemplo wf_retail, basado en el tutorial WebFOCUS - Retail Demo de la Consola Web del servidor.
La siguiente solicitud genera la tabla WF_Sales. El campo ID_PRODUCT será utilizado en el comando del join externo completo. La tabla generada contendrá los valores de 2150 a 4000 para ID_PRODUCT:
TABLE FILE WF_RETAIL_LITE SUM GROSS_PROFIT_US PRODUCT_CATEGORY PRODUCT_SUBCATEG BY ID_PRODUCT WHERE ID_PRODUCT FROM 2150 TO 4000 ON TABLE HOLD AS WF_SALES FORMAT SQLMSS END
La siguiente solicitud genera la tabla WF_PRODUCT. El campo ID_PRODUCT será utilizado en el comando del join externo completo. La tabla generada contendrá los valores de 3000 a 5000 para ID_PRODUCT:
TABLE FILE WF_RETAIL_LITE SUM PRICE_DOLLARS PRODUCT_CATEGORY PRODUCT_SUBCATEG PRODUCT_NAME BY ID_PRODUCT WHERE ID_PRODUCT FROM 3000 TO 5000 ON TABLE HOLD AS WF_PRODUCT FORMAT SQLMSS END
La siguiente solicitud emite el comando JOIN y muestra los valores de las tablas unidas:
SET TRACEUSER=ON SET TRACESTAMP=OFF SET TRACEOFF=ALL SET TRACEON = STMTRACE//CLIENT JOIN FULL_OUTER ID_PRODUCT IN WF_PRODUCT TAG T1 TO ALL ID_PRODUCT IN WF_SALES TAG T2 TABLE FILE WF_PRODUCT PRINT T1.ID_PRODUCT AS 'Product ID' PRICE_DOLLARS AS Price T2.ID_PRODUCT AS 'Sales ID' GROSS_PROFIT_US BY T1.ID_PRODUCT NOPRINT ON TABLE SET PAGE NOPAGE END
El seguimiento indica que el join externo completo ha sido optimizado (traducido a SQL) para su procesamiento en SQL Server:
SELECT T1."ID_PRODUCT", T1."PRICE_DOLLARS", T2."ID_PRODUCT", T2."GROSS_PROFIT_US" FROM ( WF_PRODUCT T1 FULL OUTER JOIN WF_SALES T2 ON T2."ID_PRODUCT" = T1."ID_PRODUCT" ) ORDER BY T1."ID_PRODUCT";
La salida tiene una línea para cada valor de ID_PRODUCT en cualquiera de las tablas. Debido a que las filas con valores de ID_PRODUCT entre 2150 y 2167 sólo aparecen en la tabla WF_SALES, las columnas de WF_PRODUCT muestran el símbolo NODATA. Debido a que las filas con valores de ID_PRODUCT superiores a 4000 sólo aparecen en la tabla WF_PRODUCT, las columnas de WF_SALES muestran el símbolo NODATA. Debido a que las filas con valores de ID_PRODUCT entre 2000 y 4000 aparecen en ambas tablas WF_SALES, hay valores en todas las columnas, como indica la siguiente imagen.
WebFOCUS |