Cómo unir orígenes de datos

Temas:

Puede unir dos o más orígenes de datos para crear una estructura más grande de datos integrados, desde la que puede crear un informe con una sola solicitud. La estructura unida es virtual: Es una manera de acceder a los múltiples orígenes de datos como si fueran uno solo origen de datos. Hasta 1023 joins pueden estar en efecto a la vez, para un total de 1024 segmentos, dependiendo del número de segmentos activos y el número y la longitud de campos (hay un límite de 32K en la longitud de todos los campos).

Para más detalles sobre los orígenes de datos que puede usar en un Join, consulte Orígenes de datos unificables y no unificables.


WebFOCUS
/>
x
Sintaxis: Cómo Combinar campos reales

La siguiente sintaxis JOIN requiere que los campos que utilice para unir los archivos sean campos reales declarados en el archivo máster. Este enlace puede ser simple, basado en un campo en cada archivo que vaya a unir, o bien un enlace de múltiples campos para orígenes de datos que admitan este tipo de comportamiento. La sintaxis que se muestra a continuación describe las variaciones simples y de campos múltiples:

JOIN [LEFT_OUTER|INNER] hfld1 [AND hfld2 ...] IN hostfile [TAG tag1]
     TO [UNIQUE|MULTIPLE]
     crfield [AND crfld2 ...] IN crfile [TAG tag2] [AS joinname]
END

donde:

JOIN hfld1
Es el nombre de un campo en el archivo host que contiene valores compartidos con un campo en el archivo de referencia cruzada. A este campo se le refiere como el campo host.
AND hfld2...
Puede ser un campo adicional en el archivo host, con las advertencias que se listan abajo. Se requiere la frase que comienza con AND al especificar campos múltiples.
  • Cuando une dos orígenes de datos FOCUS, puede especificar hasta cuatro campos alfanuméricos en el archivo host que, si se concatena, contiene valores compartidos con el archivo de referencia cruzada. No puede especificar más de un campo en el archivo de referencia cruzada cuando el sufijo del archivo es FOC. Por ejemplo, suponga que un archivo de referencia cruzada contiene un número de teléfono con formato de intercambio de prefijos. El archivo host tiene un campo de código de área, un campo de prefijo y un campo de intercambio. Puede especificar tres campos para unirlos al campo de número de teléfono en el archivo de referencia cruzada. El comando JOIN trata los tres campos como uno. Otros orígenes de datos no tienen esta restricción en el archivo de referencia cruzada.
  • Puede especificar hasta 16 campos en adaptadores que admitan joins multicampo y concatenadas. Consulte su documentación de adaptador de datos para obtener información específica acerca de las funciones de join admitidas. Tenga en cuenta que los orígenes de datos FOCUS no admiten estos joins.
INNER
Especifica una join izquierda externa. Si no especifica el tipo de join en el comando JOIN, la configuración de parámetro ALL determina el tipo de join a realizar.
LEFT_OUTER
Especifica un join izquierdo externo. Si no especifica el tipo de join en el comando JOIN, la configuración de parámetro ALL determina el tipo de join a realizar.

Tenga en cuenta que, en un join externo izquierdo, los registros host con casos de referencia cruzada no disponibles quedan incluidos en la salida del informe. Para controlar el procesamiento de pruebas en busca de casos de segmentos de referencia cruzada, no disponibles, emplee el comando SET SHORTPATH descrito en Cómo manejar un caso de segmento no disponible.

IN hostfile
Es el nombre del archivo host.
TAG tag1
Es un nombre de etiqueta de hasta ocho caracteres (habitualmente al nombre del archivo máster), que se utiliza como un acotador único para campos y aliases en el archivo host.

El nombre de etiqueta para el archivo host debe ser el mismo en todos los comandos JOIN de una estructura de join.

TO [UNIQUE|MULTIPLE] crfld1
Es el nombre de un campo en el archivo de referencia cruzada que contiene valores que armonizan con hfld1 (o de campos host concatenados). A este campo se le refiere como el campo de referencia cruzada.

Nota: Único sólo devuelve un caso y si no hay un caso que encaje en el archivo de referencia cruzada, proporciona valores predeterminados (en blanco para campos alfanuméricos y cero para campos numéricos).

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. Para más información, consulte Estructuras unidas únicas y no únicas.

AND crfld2...
Es el nombre de un campo en el archivo de referencia cruzada con valores en común conhfld2.

Nota: crfld puede estar cualificado. Este campo sólo está disponible para adaptadores de datos que admitan joins de múltiples campo.

IN crfile
Es el nombre del archivo de referencia cruzada.
TAG tag2
Es un nombre de etiqueta de hasta ocho caracteres (habitualmente el nombre del archivo máster), que se utiliza como un acotador único para campos y aliases en el archivo host. 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. Para más información, consulte Notas sobre el uso de estructuras unidas recursivas .

El nombre de etiqueta para el archivo host debe ser el mismo en todos los comandos JOIN de una estructura de join.

AS joinname
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:
  • Verifique que un comando JOIN posterior no lo sobrescriba.
  • Desea borrarlo selectivamente más tarde.
  • La estructura es recurrente. Consulte Estructuras recursivas unidas.

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.

END
Es obligatorio cuando el comando JOIN ocupa más de una línea. Finaliza el comando. Debe estar en una línea para sí solo.


Ejemplo: Cómo crear una estructura simple de enlace único

Más abajo, un ejemplo de una estructura join única y simple:

JOIN JOBCODE IN EMPLOYEE TO JOBCODE IN JOBFILE AS JJOIN


Ejemplo: Creación de una join interna

El procedimiento que sigue genera tres orígenes de datos FOCUS:

Luego el procedimiento añade un empleado nombrado Fred Newman al EMPINFO que no tiene registro que encaja en los orígenes de datos JOBINFO o EDINFO.

TABLE FILE EMPLOYEE
SUM LAST_NAME FIRST_NAME CURR_JOBCODE
BY EMP_ID
ON TABLE HOLD AS EMPINFO FORMAT FOCUS INDEX EMP_ID CURR_JOBCODE
END
-RUN
 
TABLE FILE JOBFILE
SUM JOB_DESC
BY JOBCODE
ON TABLE HOLD AS JOBINFO FORMAT FOCUS INDEX JOBCODE
END
-RUN
 
TABLE FILE EDUCFILE
SUM COURSE_CODE COURSE_NAME
BY EMP_ID
ON TABLE HOLD AS EDINFO FORMAT FOCUS INDEX EMP_ID
END
-RUN
 
MODIFY FILE EMPINFO
FREEFORM EMP_ID LAST_NAME FIRST_NAME CURR_JOBCODE
MATCH EMP_ID
ON NOMATCH INCLUDE
ON MATCH REJECT
DATA
111111111, NEWMAN, FRED, C07,$
END

La solicitud que sigue imprime los contenidos de EMPINFO. Note que se añadió Fred Newman al origen de datos.

TABLE FILE EMPINFO
PRINT *
END

La salida es:

EMP_ID     LAST_NAME        FIRST_NAME  CURR_JOBCODE
------     ---------        ----------  ------------
071382660  STEVENS          ALFRED      A07
112847612  SMITH            MARY        B14
117593129  JONES            DIANE       B03
119265415  SMITH            RICHARD     A01
119329144  BANNING          JOHN        A17
123764317  IRVING           JOAN        A15
126724188  ROMANS           ANTHONY     B04
219984371  MCCOY            JOHN        B02
326179357  BLACKWOOD        ROSEMARIE   B04
451123478  MCKNIGHT         ROGER       B02
543729165  GREENSPAN        MARY        A07
818692173  CROSS            BARBARA     A17
111111111  NEWMAN           FRED        C07

El comando JOIN siguiente genera una join interna entre los orígenes de datos EMPINFO y JOBINFO.

JOIN CLEAR *
JOIN INNER CURR_JOBCODE IN EMPINFO TO MULTIPLE JOBCODE IN JOBINFO AS J0

Note que el comando JOIN especifica una join múltiple. En una join única, el segmento de referencia cruzada nunca se considera no disponible y se muestran todos los registros desde el archivo host en la salida de informe. Se muestran valores predeterminados (en blanco para campos alfanuméricos y cero para numéricos) si no existen datos verdaderos.

La solicitud que sigue muestra campos desde la estructura unida:

TABLE FILE EMPINFO
PRINT LAST_NAME FIRST_NAME JOB_DESC
END

Se omite Fred Newman desde la salida de informe ya que su código de trabajo no tiene coincidencia en el origen de datos JOBINFO:

LAST_NAME  FIRST_NAME  JOB_DESC
---------  ----------  --------
STEVENS    ALFRED      SECRETARY
SMITH      MARY        FILE QUALITY
JONES      DIANE       PROGRAMMER ANALYST
SMITH      RICHARD     PRODUCTION CLERK
BANNING    JOHN        DEPARTMENT MANAGER
IRVING     JOAN        ASSIST.MANAGER
ROMANS     ANTHONY     SYSTEMS ANALYST
MCCOY      JOHN        PROGRAMMER
BLACKWOOD  ROSEMARIE   SYSTEMS ANALYST
MCKNIGHT   ROGER       PROGRAMMER
GREENSPAN  MARY        SECRETARY
CROSS      BARBARA     DEPARTMENT MANAGER


Ejemplo: Creación de una join izquierda externa

El comando JOIN siguiente genera una join externa izquierda entre los orígenes de datos EMPINFO y EDINFO.

JOIN CLEAR *
JOIN LEFT_OUTER EMP_ID IN EMPINFO TO MULTIPLE EMP_ID IN EDINFO AS J1

La solicitud que sigue muestra campos desde la estructura unida:

TABLE FILE EMPINFO
PRINT LAST_NAME FIRST_NAME COURSE_NAME
END

Todos los registros de empleado se muestran en la salida de informe. Los informes para aquellos empleados sin registros coincidentes en el origen de datos EDINFO muestran el carácter de datos no disponibles (.) en la columna COURSE_NAME. Si la join fuera única, se muestran espacios en blanco en lugar del carácter de datos no disponibles.

LAST_NAME  FIRST_NAME  COURSE_NAME
---------  ----------  -----------
STEVENS    ALFRED      FILE DESCRPT & MAINT
SMITH      MARY        BASIC REPORT PREP FOR PROG
JONES      DIANE       FOCUS INTERNALS
SMITH      RICHARD     BASIC RPT NON-DP MGRS
BANNING    JOHN        .
IRVING     JOAN        .
ROMANS     ANTHONY     .
MCCOY      JOHN        .
BLACKWOOD  ROSEMARIE   DECISION SUPPORT WORKSHOP
MCKNIGHT   ROGER       FILE DESCRPT & MAINT
GREENSPAN  MARY        .
CROSS      BARBARA     HOST LANGUAGE INTERFACE
NEWMAN     FRED        .


Ejemplo: Creación de dos joins internas con una estructura Multipath

Los siguientes comandos JOIN crean una join interna entre los orígenes de datos EMPINFO y JOBINFO y una join interna entre los orígenes de datos EMPINFO y EDINFO:

JOIN CLEAR *
JOIN INNER CURR_JOBCODE IN EMPINFO TO MULTIPLE JOBCODE IN JOBINFO AS J0
JOIN INNER EMP_ID IN EMPINFO TO MULTIPLE EMP_ID IN EDINFO AS J1

La estructura generada por las dos joins, tiene dos rutas independientes:

         SEG01
 01      S1
**************
*EMP_ID      **I
*CURR_JOBCODE**I
*LAST_NAME   **
*FIRST_NAME  **
*            **
***************
 **************
       I
       +-----------------+
       I                 I
       I SEG01           I SEG01
 02    I KM        03    I KM
..............    ..............
:EMP_ID      ::K  :JOBCODE     ::K
:COURSE_CODE ::   :JOB_DESC    ::
:COURSE_NAME ::   :            ::
:            ::   :            ::
:            ::   :            ::
:............::   :............::
 .............:    .............:
 JOINED  EDINFO    JOINED  JOBINFO

La solicitud que sigue muestra campos desde la estructura unida:

SET MULTIPATH=SIMPLE
TABLE FILE EMPINFO
PRINT LAST_NAME FIRST_NAME IN 12 COURSE_NAME JOB_DESC
END

Con MULTIPATH=SIMPLE, las rutas independientes generan joins independientes. Todos los registros de empleado aceptados por cualquier join se muestra en la salida de informe. Sólo se omite Fred Newman (quien no tiene registros coincidentes en ninguno de los archivos de referencia cruzada):

LAST_NAME  FIRST_NAME  COURSE_NAME                     JOB_DESC
---------  ----------  -----------                     --------
STEVENS    ALFRED      FILE DESCRPT & MAINT            SECRETARY
SMITH      MARY        BASIC REPORT PREP FOR PROG      FILE QUALITY
JONES      DIANE       FOCUS INTERNALS                 PROGRAMMER ANALYST
SMITH      RICHARD     BASIC RPT NON-DP MGRS           PRODUCTION CLERK
BANNING    JOHN        .                               DEPARTMENT MANAGER
IRVING     JOAN        .                               ASSIST.MANAGER
ROMANS     ANTHONY     .                               SYSTEMS ANALYST
MCCOY      JOHN        .                               PROGRAMMER
BLACKWOOD  ROSEMARIE   DECISION SUPPORT WORKSHOP       SYSTEMS ANALYST
MCKNIGHT   ROGER       FILE DESCRPT & MAINT            PROGRAMMER
GREENSPAN  MARY        .                               SECRETARY
CROSS      BARBARA     HOST LANGUAGE INTERFACE         DEPARTMENT MANAGER

Con MULTIPATH=COMPOUND, sólo se muestran empleados con registros coincidentes en ambos archivos de referencia cruzada en la salida de informe:

LAST_NAME  FIRST_NAME  COURSE_NAME                     JOB_DESC
---------  ----------  -----------                     --------
STEVENS    ALFRED      FILE DESCRPT & MAINT            SECRETARY
SMITH      MARY        BASIC REPORT PREP FOR PROG      FILE QUALITY
JONES      DIANE       FOCUS INTERNALS                 PROGRAMMER ANALYST
SMITH      RICHARD     BASIC RPT NON-DP MGRS           PRODUCTION CLERK
BLACKWOOD  ROSEMARIE   DECISION SUPPORT WORKSHOP       SYSTEMS ANALYST
MCKNIGHT   ROGER       FILE DESCRPT & MAINT            PROGRAMMER
CROSS      BARBARA     HOST LANGUAGE INTERFACE         DEPARTMENT MANAGER

Principio de página

x
Referencia: requisitos para campos de referencia cruzada en un equijoin

Los campos de referencia cruzada utilizados en un JOIN, deben tener los caracteres siguientes en orígenes de datos específicos:


Principio de página

x
Referencia: Restricciones de campos de grupo

Cuando se utilizan campos de grupo en una estructura unida, el grupo en el archivo host y el grupo en el archivo de referencia cruzada deben tener el mismo número de elementos:


Principio de página

x
Referencia: Notas sobre el uso para sintaxis de comandos JOIN internos y externos

Principio de página

x
Cómo unir desde un campo virtual con un campo real mediante un equijoin

Cómo:

Referencia:

Puede utilizar sintaxis JOIN basada en DEFINE para crear un campo host virtual que puede unir con un campo de referencia cruzada real. La expresión DEFINE que crea el campo host virtual puede contener solamente campos en el archivo host y constantes. (Puede que no contenga campos en el archivo de referencia cruzada.) Puede hacer más de un join desde un campo virtual.

Puede crear el campo host virtual en un comando DEFINE independiente o en el archivo máster. Para más información sobre archivos máster, consulte el manual Cómo describir datos con el lenguaje WebFOCUS

La misma solicitud de informe puede usar campos virtuales basados en JOIN y campos virtuales no relacionados con la join.

Tenga en cuenta que al crear un campo virtual en un comando DEFINE, debe emitir DEFINE después del comando JOIN, pero antes de la solicitud TABLE, pues un comando JOIN borra todos los campos creados por comandos DEFINE para el archivo host y la estructura unida. No se borran los campos virtuales definidos en los archivos máster.

Sugerencia: Si un comando DEFINE precede al comando JOIN, puede ajustar KEEPDEFINES ON para que restituya los campos virtuales durante el análisis de un comando JOIN posterior . Para más información, consulte Cómo conservar campos virtuales con KEEPDEFINES.



x
Sintaxis: Cómo Combinar desde un campo virtual con un campo real

El comando JOIN basado en DEFINE le permite unir un campo virtual en el archivo host con un campo real en el archivo de referencia cruzada. La sintaxis es:

JOIN [LEFT_OUTER|INNER] deffld WITH host_field ... 
     IN hostfile [TAG tag1]
     TO [UNIQUE|MULTIPLE] 
     cr_field IN crfile [TAG tag2] [AS joinname]
END

donde:

JOIN deffld
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. Para obtener información relacionada, consulte Notas sobre el uso de campos virtuales con orígenes de datos unidos.
WITH host_field
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. Consulte el manual Cómo desarrollar aplicaciones de informes para obtener detalles sobre los comandos de consulta.

INNER
Especifica una join izquierda externa. Si no especifica el tipo de join en el comando JOIN, la configuración de parámetro ALL determina el tipo de join a realizar.
LEFT_OUTER
Especifica un join izquierdo externo. Si no especifica el tipo de join en el comando JOIN, la configuración de parámetro ALL determina el tipo de join a realizar.
IN hostfile
Es el nombre del archivo host.
TAG tag1
Es un nombre de etiqueta de hasta ocho caracteres (habitualmente el nombre del archivo máster), que se utiliza como un acotador único para campos y aliases en el archivo host.

El nombre de etiqueta del archivo host debe ser el mismo en todos los comandos JOIN de una estructura de join.

TO [UNIQUE|MULTIPLE] crfld1
Es el nombre de un campo real en los orígenes de datos de referencia cruzada cuyos valores hacen juego con los del campo virtual. Esto debe ser un campo real declarado en el archivo máster.

Nota: Único sólo devuelve un caso y si no hay un caso que encaje en el archivo de referencia cruzada, proporciona valores predeterminados (en blanco para campos alfanuméricos y cero para campos numéricos).

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. Para más información, consulte Estructuras unidas únicas y no únicas.

IN crfile
Es el nombre del archivo de referencia cruzada.
TAG tag2
Es un nombre de etiqueta de hasta ocho caracteres (habitualmente el nombre del archivo máster), que se utiliza como un acotador único para campos y aliases en el archivo host. 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. Para más información, consulte Notas sobre el uso de estructuras unidas recursivas .

El nombre de etiqueta del archivo host debe ser el mismo en todos los comandos JOIN de una estructura de join.

AS joinname
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:
  • Verifique que un comando JOIN posterior no lo sobrescriba.
  • Desea borrarlo selectivamente más tarde.
  • La estructura es recurrente y no especifica nombres de etiqueta. Consulte Estructuras recursivas unidas.

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.

END
Es obligatorio cuando el comando JOIN ocupa más de una línea. Finaliza el comando. Debe estar en una línea para sí solo.


x
Referencia: Notas sobre el uso de campos virtuales con orígenes de datos unidos

Las solicitudes que lean orígenes de datos unidos pueden contener igualmente campos virtuales que se definen:



Ejemplo: Cómo crear un campo host virtual para una estructura unida

Supongamos que una cadena de tiendas manda a cuatro gerentes de sucursales a tomar clases. Cada uno de estos gerentes, con su número de identificación, administra una tienda en una ciudad diferente. Los establecimientos y ciudades en que se encuentran, están incluidos en el origen de datos SALES. Los ids., cursos y fechas en que acudieron los gerentes, están incluidos en el origen de datos EDUCFILE.

El procedimiento que sigue lista los cursos a los que asistieron los gerentes, identificando a los gerentes por la ciudad en que trabajan. Tenga en cuenta que el procedimiento consta de tres elementos:

El procedimiento es:

JOIN ID_NUM WITH CITY IN SALES TO ALL EMP_ID IN EDUCFILE AS SALEDUC
DEFINE FILE SALES
ID_NUM/A9 = DECODE CITY ('NEW YORK' 451123478 'NEWARK' 119265415
                         'STAMFORD' 818692173 'UNIONDALE' 112847612);
END
TABLE FILE SALES
PRINT DATE_ATTEND BY CITY BY COURSE_NAME
END

La salida es:

CITY                    COURSE_NAME                 DATE_ATTEND
----                    -----------                 -----------
NEW YORK                FILE DESCRPT & MAINT           81/11/15
NEWARK                  BASIC RPT NON-DP MGRS          82/08/24
STAMFORD                BASIC REPORT PREP DP MGRS      82/08/02
                        HOST LANGUAGE INTERFACE        82/10/21
UNIONDALE               BASIC REPORT PREP FOR PROG     81/11/16
                        FILE DESCRPT & MAINT           81/11/15

Principio de página

x
Formatos de datos de campos compartidos

Por lo general, los campos que contienen los valores compartidos en los campos host y de referencia cruzada deben tener los mismos formatos.

Si especifica campos con múltiples archivos de host, el comando JOIN los trata como si fueran un solo campo concatenado. Añada las longitudes de los formatos de campo para obtener la longitud del campo concatenado. Debe observar las reglas que siguen:


Principio de página

x
Cómo unir campos con tipos diferentes de datos numéricos

Cómo:

Puede unir dos o más orígenes de datos que contengan diferentes tipos de datos numéricos. Por ejemplo, puede unir un campo con un formato de decimal empaquetado corto con un formato de decimal empaquetado largo, o bien un campo con un formato de número entero con otro con formato de decimal empaquetado. Esto le proporciona significativa flexibilidad para crear informes desde orígenes de datos unidos.

Nota:



x
Sintaxis: Cómo Habilitar joins con conversión de tipo de datos

Para habilitar joins con conversión de tipos de datos, emita el comando

SET JOINOPT = [NEW|OLD]

donde:

NEW
Le permite unir con conversión de tipos de datos.
OLD
Deshabilita las joins con conversión de tipos de datos. Este valor es el predeterminado.


Ejemplo: Cómo emitir joins con conversión de tipos de datos

Dado que puede enlazar un campo con un formato de decimal corto a un campo con formato de decimal largo, se puede definir una join en los siguientes archivos máster:

FILE=PACKED,SUFFIX=FIX,$
  SEGNAME=ONE,SEGTYPE=S0
   FIELD=FIRST,,P8,P4,INDEX=I,$
FILE=PACKED2,SUFFIX=FIX,$
  SEGNAME=ONE,SEGTYPE=S0
   FIELD=PFIRST,,P31,P16,INDEX=I,$

El comando JOIN podría tener el siguiente aspecto:

JOIN FIRST IN PACKED TO ALL PFIRST IN PACKED2 AS J1

Al unir campos empaquetados, el formato preferido de signo X'C' para valores positivos y X'D' para valores negativos continúa siendo un requisito. Todos los otros signos no preferidos se convierten a X'C' o a X'D'.


WebFOCUS