You are on page 1of 32

OpenSQL.

Ejemplo 1: la instruccin SELECT simple

Hay tres partes obligatorias de una instruccin SELECT, bsicamente la definicin de


lo que desea leer de qu tabla y dnde colocar el resultado:

1, Despus de la SELECT palabra clave, hay que especificar los campos del llamado
"conjunto de resultados" ( "conjunto resultante" en la ayuda de SAP). Aqu se define
qu campos queremos ver en el resultado de la seleccin. En el Ejemplo 1, entramos
en "*", un carcter especial que significa que se devolvern todos los campos de la
tabla (s) definido. Esta es una caracterstica muy til, pero tenga en cuenta si
selecciona todos los campos de una tabla que consta de 250 columnas, y se utiliza
slo cinco de ellos, que los residuos de una gran cantidad de CPU, memoria y
recursos de red. En este caso es mejor para enumerar los cinco campos
explcitamente (en especial si se selecciona una gran cantidad de registros).

2, el FROM clusula define qu tabla (s) para leer los datos. Aqu hay que especificar
al menos una tabla o vista que existe en el diccionario de datos. En el primer ejemplo
que slo se accede a una tabla, y los ejemplos posteriores utilizaremos ms tablas.

3, La IN clusula define dnde poner los resultados, which se suele denominar como
un "rea de trabajo". Aqu se debe definir el objeto de datos que contendr el conjunto
de resultados utilizando una de las siguientes opciones:

- EN x, donde x es una estructura.


- INTO TABLE y, donde y es una tabla interna.
- Al aadir TABLA z, donde z es una tabla interna. En este conjunto de resultados se
aade a la tabla interna (sin vaciar el contenido existente).
- En (a, b, c, ...), donde a, b, c etc. son variables con tipos elementales

Hay varias instrucciones de la ayuda de SAP con respecto a los requisitos de las
reas de trabajo (tipo de datos, etc.) y las reglas de asignacin (conversiones
automticas, etc.) que no quiero copiar y pegar aqu. Se lo recomiendo de todas
formas, ya sea usando una estructura idntica a la seleccin de campos, o el uso de
los "campos correspondientes de" adicin. Esto asignar los campos seleccionados
para los campos de la zona de trabajo basado en el nombre del campo (no de
izquierda a derecha).

Para todas las construcciones excepto INTO TABLE, si el conjunto de resultados est
vaco, el objetivo se mantiene sin cambios.

Sugerencia : la clusula INTO se puede omitir en un caso especial, cuando se utiliza


una funcin de grupo para contar el nmero de lneas que coincidan con la clusula
WHERE. En este caso la variable del sistema SY-DBCNT llevar a cabo el nmero de
registros encontrados. Vase el Ejemplo 5.

Nota : La clusula INTO no se encuentra en las capturas de pantalla porque la


herramienta que he utilizado genera automticamente. De todos modos, todos los
ejemplos que usaran la variante INTO TABLE para recuperar todos los registros que
coinciden a la vez.

Requisito de negocio : queremos seleccionar todos los datos para 100 reservas de la
tabla de reserva. Muy simple, verdad?

Cmo lograr esto? Basta con definir "*" despus de la palabra clave SELECT,
especifique la tabla Sbook en la clusula FROM y limitar el nmero de registros fue a
buscar a travs del "HASTA clusula N filas". Esto se puede utilizar para definir el
nmero mximo de lneas que queremos que devuelva la consulta. Esto se utiliza
normalmente para los controles de existencia (hasta 1 filas), pero en este ejemplo
hemos limitado la consulta para devolver un mximo de 100 registros. A menos que
especifique la clusula ORDER BY, esto devolver 100 registros arbitrarios, por lo que
no puede saber cuales 100 se devolver.

Imagen 1: Slo tiene que seleccionar la tabla 100 bookingsfrom Sbook

Ejemplo 2: Adicin de una clusula WHERE y una tabla de unin

La clusula WHERE

Por lo general, las instrucciones SELECT no lee todo el contenido de una tabla
(excepciones tpicas son pequeas tablas de personalizacin que llevan a cabo unos
pocos registros), pero slo se devuelven entradas especficas. La clusula WHERE se
utiliza para filtrar el conjunto de resultados, o en otras palabras decir la base de datos
que registra para recuperar. Aqu se define una expresin lgica que la base de datos
evaluar para cada fila de la base de datos.

Requisito de negocio : devolver solo reservas de Lufthansa (CARRID campo debe


contener "LH") y se cancela no se necesitan reservas (CANCELADA debe ser igual al
espacio).

La base de datos evaluar esta condicin para cada registro de la tabla y si la


condicin es verdadera, se coloca en el conjunto de resultados. Puede escribir
condiciones lgicas mucho ms complejo, como veremos en los siguientes
ejemplos. Cualquier nmero de expresiones lgicas se puede vincular a una
expresin lgica con las palabras clave AND u OR y el resultado de una expresin
lgica puede ser negado el uso de palabras clave NO. Mantener el orden de
evaluacin en mente (garantizar el buen uso de los parntesis). operadores simples
que se usan para comparar los valores de campo son EQ, NE, GT, LT, GE y LE
(equivalente a =, <>,>, <,> =, <=).

uniones de tablas

La segunda adicin interesante en este ejemplo es la unin de tablas. A menudo, los


datos necesarios para un proceso de negocio especfico se almacena en varias
mesas. Aunque podra ser una opcin para seleccionar datos de cada tabla con los
comandos SELECT separadas y combinar los resultados utilizando el cdigo ABAP se
ejecuta en el servidor de aplicaciones, muchas veces es ms conveniente y
performant utilizar slo una instruccin SELECT para leer todas las mesas a la vez .

Requisito de negocio : leer datos de los clientes de SCUSTOM mesa para el cliente
de cada reserva.

Esto se consigue utilizando un as llamado "unin de tablas": un constructo que da


instrucciones a la base de datos para acceder a una tabla an ms sobre la base de
una condicin. Esta denominada "condicin de combinacin" (o "expresin de
combinacin") representa la relacin lgica entre las dos tablas. En este ejemplo, es el
nmero de cliente: para cada reserva en la tabla Sbook la base de datos va a buscar
los datos de los clientes en SCUSTOM tabla en funcin del nmero de cliente.

Debido a que usamos "*" para definir los campos del conjunto de resultados y se lee a
partir de dos tablas en este ejemplo, el conjunto de resultados contiene todos los
campos de ambas tablas.Si hay un campo con el mismo nombre en ambas tablas,
slo uno ser devuelto (el de la ltima tabla en la clusula FROM - cada combinacin
sobrescribe el contenido del campo).

Nota : la herramienta que he utilizado para las capturas de pantalla automticamente


genera un campo adicional en este estudio. Esta es la razn por la que usted puede
ver los campos duplicados.

La sintaxis de una condicin de unin es casi el mismo como en una clusula WHERE
con algunas diferencias notables, que no quiero copiar y pegar aqu de la ayuda de
SAP (no se puede utilizar subconsultas, debe usar y para vincular las expresiones
lgicas, etc.).

Hay dos tipos de combinaciones de tablas en OpenSQL: uniones interiores y


combinaciones externas. Vamos a discutir la diferencia en el siguiente ejemplo.

Sugerencia : las instrucciones SELECT utilizando uniones de tablas de


amortiguacin de derivacin SAP.

Imagen 2: aadir una clusula WHERE y una tabla de unin

Ejemplo 3: Adicin de datos de otras dos mesas

Afortunadamente OpenSQL permite unir varias tablas a la vez: mximo 25 tablas se


pueden unir en una instruccin SELECT. Aqu, en este ejemplo aadimos datos de
dos tablas ms: T005T la que posee los datos de pas y GEOT005S que contiene la
informacin geogrfica de las regiones.

Requisito de negocio : Muestra el nombre del pas en vez de cdigo de pas y mostrar
la latitud y longitud de la regin del cliente.

Una cosa especial en este ejemplo es la condicin de unin de T005T tabla. Esta
tabla es dependiente del lenguaje, por lo que es necesaria una clave de idioma para
obtener la descripcin textual de un pas en un idioma especfico. Recuerde : la
condicin de unin le dice a la base de datos cmo conseguir un registro de la tabla B
basado en un registro de la tabla A (siendo A la izquierda, y siendo B la tabla a la
derecha). Esto es especial ahora, porque usamos el idioma de trabajo del usuario
actual del campo SY-IDIOMA. Todos los campos de la estructura SY pueden ser
utilizados en condiciones de combinacin (fecha, hora, ID del sistema, etc.), as como
dnde y HAVING.
Qu pasara si queremos omitir la especificacin clave de idioma? La base de datos
volvera varias filas con la misma informacin de la reserva, el cliente y la regin. Por
qu? Simplemente porque hay una morethan entradas en T005T mesa para el mismo
pas. Supongamos que tenemos dos entradas para el pas 'DE': es 'Deutschland' en
alemn y es 'Alemania' en Ingls. En el caso de un cliente alemn, el motor de base
de datos sera evaluar la condicin de unin (T005T-Tierra1 = SCUSTOM-PAS) para
ambos registros, y ambos sera verdad, por lo que seran devueltos dos filas: una con
el texto Ingls y uno con el texto alemn .

Imagen 3: mesa varias combinaciones. Observe que todas las lneas contienen una
latitud y una longitud.

Ejemplo 4: Otro tipo de unin de tablas - externa izquierda

Aqu viene la diferencia entre los dos tipos de uniones de tablas en OpenSQL: la
unin interna y la combinacin externa (por ej "SELECT * FROM A INNER JOIN B" /
"SELECT * FROM Una combinacin externa izquierda B".).

Bsicamente la diferencia es el comportamiento en caso de que no existe una entrada


correspondiente en el cuadro B para un registro en la tabla A. En caso de una
combinacin interna, no habra ningn registro colocado en el conjunto de
resultados. En caso de una combinacin externa izquierda, no habra un registro en el
conjunto de resultados, pero todos los campos procedentes de la tabla B estara
vaca.

Este es el comportamiento es muy fcil ver en este ejemplo: hemos aadido


coordenadas geogrficas de nuestra consulta en el ejemplo anterior, mediante una
combinacin interna. Tabla GEOT005S contiene las coordenadas de las regiones de
pases. Cada vez que un registro no se encontr en GEOT005S de mesa para la
regin de un cliente, la lnea entera se elimin en el conjunto de resultados. Es por
esto que slo se puede ver a los clientes con la latitud no vaco y longitud.

En el ejemplo actual se aade la latitud y longitud de la regin del cliente utilizando


una combinacin externa izquierda. Como se puede ver en la captura de pantalla, slo
hay un cliente, para los que no son devueltos coordenadas. Para todos los dems
registros, el PP no se encontr un registro adecuado en GEOT005S, por lo que las
coordenadas estn vacos. Si GEOT005S se puede acceder mediante un INNER
JOIN, estos registros seran excluidos del conjunto de resultados.

Captura de pantalla 4: unin de tablas utilizando una combinacin externa


izquierda. Tenga en cuenta que aparecen ahora los clientes con la latitud y longitud
vaco en la lista.

Nota : si se ha comprobado cuidadosamente la pantalla, se puede notar que hay un


cliente con una regin definida ( 'IL'), pero no hay coordenadas mostradas. La razn
podra ser que no hay ninguna entrada en el pas de GEOT005S regin de Estados
Unidos '' IL ', pero no es el caso. De alguna manera, la base de datos de
demostracin de vuelo estndar contiene entradas incorrectas que tienen un espacio
innecesario. Esta es la razn por la cual la base de datos no encuentra el registro
coincidente, ya que 'IL' <> 'IL'.
Imagen 4 b: entradas incorrectas para la regin 'IL' en GEOT005S mesa

He corregido estas entradas con esta declaracin simple actualizacin:

Despus de corregir las entradas en SCUSTOM tabla, la consulta llena las


coordenadas para todos los clientes en 'IL' regin:

Imagen 4 c: unin de tablas utilizando una combinacin externa izquierda despus de


corregir las entradas de base de datos problemticos. Tenga en cuenta que ahora
cada cliente que tiene una regin definida tiene las coordenadas llenos.
Ejemplo 5: la adicin de un grupo de funciones simples

Muchas veces la empresa no est interesada en todos los registros de datos


individuales, pero quieren ver una agregacin basado en un campo especfico. Por
ejemplo, la suma de todas las ventas por vendedor, los costos por proyecto, etc. En
este caso tenemos dos opciones: o bien recuperar todos los registros pertinentes de
la base de datos y realizar los clculos en el servidor de aplicaciones utilizando
nuestro propio cdigo ABAP, o llevar a cabo el clculo utilizando el motor de base de
datos.

Requisito de negocio : queremos ver el nmero de reservas que coincidan con los
criterios de seleccin. (reservas de Lufthansa que no sean canceladas).

Para lograr esto usando la base de datos, tenemos que aadir una clusula GROUP
BY y tenemos que definir la funcin de agregado (tambin llamado como funcin de
grupo) cuentan en la clusula SELECT.

La clusula GROUP BY combina grupos de filas del conjunto de resultados en una


sola fila. En este caso muy simple, queremos ver el nmero total de reservas, no
desglosados por cualquier otro campo.

La funcin COUNT (*) determina el nmero de filas en el conjunto de resultados o en


el grupo actual. En este momento no tenemos grupos definidos por lo que en nuestro
caso se devuelve el nmero total de las reservas.

Imagen 5: una funcin simple grupo contando el nmero de reservas que coincidan
con los criterios de seleccin.

Nota: La funcin cuenta tambin se puede utilizar para determinar el nmero de


diferentes valores de un campo especfico en el conjunto de resultados. En este caso,
basta con poner el nombre de campo en los parntesis y aadir la palabra clave
DISTINCT. Por ej. para contar cuntos pases son los clientes de, utilizan "COUNT
(DISTINCT pas)" en la clusula SELECT.

Es importante tener en cuenta que las funciones de grupo siempre se llevan a cabo
despus de la evaluacin de la clusula WHERE. El motor de base de datos primero
lee los registros que coincidan con la clusula WHERE, forma grupos (vase el
siguiente ejemplo) y luego realiza la funcin de grupo.

El uso de la clusula GROUP BY y funciones de agregado asegura que los agregados


y los grupos son ensamblados por el sistema de base de datos, no el servidor de
aplicaciones. Esto puede reducir considerablemente el volumen de datos que tiene
que ser transferido de la base de datos al servidor de aplicaciones. Por supuesto en el
otro lado, este necesita ms recursos de la base de datos.

Sugerencia : Con el uso de GROUP BY, la instruccin SELECT evita el


almacenamiento en bfer de SAP.

Ejemplo 6: la definicin de grupos para las funciones de grupo

Hemos aprendido que las funciones del grupo realizan ciertos clculos en grupos de
registros de base de datos. Si no se especifica explcitamente un grupo, entonces
todos los registros del conjunto de resultados son considerados como un grupo
grande, como en el ejemplo anterior.

Requisito de negocio : mostrar el nmero de (no cancelado Lufthansa) las reservas


por cliente.

En este caso, formamos grupos de registros de base de datos basados en el nmero


de cliente haciendo una lista de ID de campo en la clusula group by. Adems,
tenemos que entrar en el campo ID de SCUSTOM tabla en la clusula SELECT antes
de la funcin de grupo.
Imagen 6: Agrupar filas por ID de cliente. La funcin de grupo COUNT se lleva a cabo
en cada grupo para contar el nmero de reservas para cada cliente.

Como se puede ver, ahora el motor de base de datos devuelve tantos registros como
muchos ID de cliente que tenemos en el conjunto de resultados, y el nmero de
reservas pertinentes prximos a ellos. Exactamente lo que queramos.

Nota : en todos nuestros ejemplos anteriores, hemos utilizado el "*" signo en la


clusula SELECT (lista de campos). Sin embargo, aqu tenemos que definir
explcitamente los campos necesarios para crear grupos de registros. Es obligatorio
para aadir el nombre de la tabla y el signo ~ antes de que el nombre de un campo de
base de datos, si ms de una tabla tiene un campo con el mismo nombre.

Ejemplo 7: Adicin de informacin extra

requisito de negocio: visualizar campos adicionales en la lista de resultados (nombre,


ciudad, pas, cdigo de regin, coordenadas).

Cmo hacerlo? Basta con aadir a la clusula SELECT despus de que el nmero
de cliente antes de la funcin COUNT. Tenga en cuenta para agregar el campo a la
clusula GROUP BY tambin, de lo contrario se encontrar con un error de
sintaxis. Los campos que se utilizan para formar grupos deben estar en la clusula
SELECT, y nada ms deben estar en la clusula SELECT que no est en la clusula
GROUP BY a menos que sea un argumento de una funcin de grupo.
Captura de pantalla 6a: campos adicionales se muestran en la lista.

Nota: Es tcnicamente posible omitir un campo de la clusula SELECT, que es parte


de la clusula GROUP BY, pero realmente no tiene mucho sentido. Por ejemplo, el
conjunto de resultados se agrupan por dos campos, pero slo se mostrar un campo
de agrupamiento.
6b pantalla: omitiendo el campo ID de conexin de la clusula SELECT es
sintcticamente correcta, sin embargo, no tiene sentido. Ver que el mismo ID de
portadora aparece tantas veces como existen muchos identificadores de conexin
para ello, pero los ID de conexin no forman parte del conjunto de resultados.

Nota: Ahora usted podra preguntarse que en el ejemplo anterior he dicho que
mediante la adicin de campos antes de la funcin de grupo es la forma en que
definimos los grupos, pero en este caso el nmero de reservas no cambi. La razn
es que hemos aadido los campos de tablas que tienen una relacin 1: 1 para el
cliente. Un cliente tiene un solo nombre, es una ciudad en un solo pas y la regin y
tiene un par de coordenadas. Si hubiramos elegido para agregar el campo de vuelo
Clase (Primera clase / Negocios / Economa), entonces el conjunto de resultados
podra contener ms de una lnea por el cliente: el mayor nmero de lneas por cliente
como muchos tipos de vuelos que l / ella tena. Vamos a ver cmo funciona esto en
el ejemplo 15.

Ejemplo 8: Definir el orden de los registros en el conjunto de resultados

Puede utilizar la clusula ORDER BY en una consulta para definir el orden de


clasificacin de los registros devueltos. Simplemente una lista de todos los campos
que desea utilizar como criterio de clasificacin. Puede utilizar palabras clave que
suben y descienden para cada campo para especificar el modo de clasificacin
(ascendente es el valor por defecto por lo que se puede omitir).

Requisito de negocio: mostrar a los clientes con la mayor cantidad de reservas.

Que hacemos ahora? Nos ordenar la lista por el resultado de la funcin COUNT en
orden descendente y luego por el nombre del cliente.

Imagen 7: el conjunto de resultados se ordena el uso de la clusula ORDER BY.

Como se puede ver, hay varios clientes que tienen ms de diez reservas (no
cancelados, Lufthansa).

Nota : Si todos los campos clave estn en la lista de campos y se especifica una sola
tabla de base de datos despus de DE (no una vista o la expresin de combinacin),
la clave Adems maestro se puede usar para ordenar el conjunto de resultados en
orden ascendente basado en la clave principal de la mesa.

Ejemplo 9: Filtrado basado en una funcin de grupo

Requisito de negocio : el jefe slo est interesado en los clientes que tienen ms de
diez reservas de Lufthansa no cancelados.
Cmo hacemos esto? Creo que la primera idea sera aadir una nueva condicin de
la clusula WHERE para filtrar registros en los que la funcin de recuento es superior
al diez. Sin embargo, esto no funcionar debido a la OpenSQL (y SQL en general)
lengua.

La razn es que la clusula WHERE filtra los registros de base de datos antes de
que los grupos son creados por el motor de base de datos. Una vez creados los
grupos, las funciones de grupo se calculan y el conjunto de resultados se crea. La
clusula WHERE no se puede utilizar para filtrar en funcin de los resultados de la
funcin de grupo.

En casos como estos, se debe utilizar la clusula HAVING. Esto es similar a la


clusula WHERE, pero la diferencia es que se evala despus de los grupos se
crean y se llevan a cabo funciones de grupo. Poner simplemente: filtrar basndose en
el resultado de las funciones de grupo, la clusula HAVING debe ser utilizado
(tambin llamado como condicin de grupo).

Imagen 8: el uso de la clusula HAVING para filtrar el conjunto de resultados en base


a las funciones de grupo.

Como se puede ver en la captura de pantalla, ahora slo 23 registros devueltos,


aunque hemos permitido tener 100 registros mediante el uso de la UP TO N filas
adicin. As que esto significa que hay 23 clientes que tienen ms de diez reservas
Lufthansa no cancelados.

Nota : Si no se especifica ningn grupo utilizando la clusula GROUP BY, la clusula


HAVING tendr en cuenta todo el conjunto de resultados agrupados en una sola
lnea. Para un rpido ejemplo supongamos que tenemos 10 registros en SCARR
tabla. La consulta "SELECT COUNT (*) A partir de Scarr HAVING count (*) GT 0"
devolver una sola lnea con el nmero de registros en la tabla, pero la consulta
"SELECT COUNT (*) A partir de Scarr HAVING count (*) GT 10 "no devolver ningn
lneas (conjunto de resultados vaco).

Ejemplo 10: uso de subconsultas

La posibilidad de combinar varias instrucciones SELECT en uno es una caracterstica


muy til en OpenSQL. Esto se utiliza sobre todo cuando no se sabe exactamente por
los criterios del filtro durante el tiempo de diseo o cuando se tiene que utilizar una
comparacin con un valor calculado de forma dinmica.

Requisito de negocio : la lista debe incluir slo los clientes que no hayan cancelado un
vuelo (cualquier lnea area, no slo Lufthansa). En el primer vistazo, se puede pedir
lgicamente que esto ya est hecho, ya que hemos "cancelado espacio EQ 'en
nuestro clusula WHERE. Esto no es correcto, porque esto slo influye en nuestra
funcin de grupo de manera que slo las reservas no canceladas se cuentan. Esto
significa que si un cliente tiene 20 reservas con una cancela, l / ella estar en nuestra
lista con 19 reservas. De acuerdo con nuestras necesidades, no queremos que este
cliente para estar en nuestra lista, por lo que cmo lograr eso?

Una manera fcil de solucionar esto es aadir una llamada sub consulta a nuestra
clusula WHERE que comprueba si hay una reserva cancelada por el cliente.

Subconsultas en general

Bsicamente una subconsulta es una instruccin SELECT que aparece entre


parntesis en una expresin lgica. No hay necesidad de tener una clusula INTO
porque el resultado de la subconsulta ser procesada por el motor de base de datos.

Cmo son los resultados de subconsultas evaluados? Esto depende de si la


subconsulta se correlaciona o no. Si una subconsulta utiliza campos de la instruccin
SELECT que rodea en su condicin WHERE, que se llama una consulta
correlacionada. En este caso, el resultado de la subconsulta se evala para cada lnea
en el conjunto de resultados de la instruccin SELECT circundante (en el que es
donde se coloca la clusula de la subconsulta). Esto implica que la sub consulta es
para cada registro en el conjunto de resultados de la instruccin SELECT
circundante.Por otra parte, una sub consulta sin ninguna referencia a la instruccin
SELECT que rodea slo se ejecuta una vez.

Hay diferentes operadores de la cual se puede utilizar con subconsultas, usaremos la


"existe" operador (negada) en este ejemplo. Voy a hablar de los otros en el Ejemplo
13.

Subconsultas pueden anidarse que significa que usted puede poner una subconsulta
en la clusula WHERE de una subconsulta. Vamos a ver un ejemplo de esto ms
adelante en el Ejemplo 13.

Desde aqu, tomar el ejemplo actual: tenemos que comprobar si un cliente tiene una
reserva cancelada, por lo que tenemos que crear una relacin entre el ID de cliente en
el conjunto de resultados de nuestra instruccin SELECT externa y la sub consulta
(por lo que utilizar una consulta correlacionada). Esto se hace mediante la adicin de
una condicin a la clusula WHERE de la subconsulta para que coincida con los ID de
cliente.

Imagen 9: el uso de una subconsulta. Como se puede ver, ahora slo se devuelven 20
registros, por lo que tres clientes tenan un vuelo cancelado en nuestra lista anterior.

Los alias de tabla

Ntese que aqu hay que utilizar los llamados "alias de tabla" porque seleccionamos
de la misma tabla, tanto en la consulta de los alrededores y la subconsulta. Esto
significa que de alguna manera tenemos que definir explcitamente el nombre de la
tabla para los campos que deben compararse, de lo contrario el motor de base de
datos no sabramos qu campo de la tabla nos referimos a. Esto se hace con el uso
de alias de tabla. Bsicamente se puede dar un nombre a las tablas y se refieren a
ellos utilizando el alias. Aqu he define "cuadrados" como un alias para la
subconsulta. Usted tiene que utilizar el carcter ~ entre el alias de la tabla y el nombre
del campo (y, por supuesto, entre el nombre de la tabla y el nombre del campo como
en los ejemplos anteriores).

notas :

Las subconsultas no se pueden utilizar cuando se accede a mesas de billar o


tablas de racimo.

la clusula ORDER BY no se puede utilizar en una subconsulta.

Si se utiliza una subconsulta, la instruccin SQL abierto no pasa por el


almacenamiento en bfer de SAP.
Nota : subconsultas se pueden utilizar en la clusula HAVING tambin como se ve en
el ejemplo 14.

Sugerencia : se podra haber resuelto el requisito sin una consulta correlacionada. En


este caso, el sub consulta seleccionara todos los clientes que tenan una reserva
cancelada, y la instruccin SELECT que rodea comprobara cada cliente si est en el
conjunto de resultados de la subconsulta:

ejemplo simplificado:

SELECT ... DONDE customid NO EN (seleccione customid de Sbook donde cancelado EQ


'X').
es igual a
SELECT ... WHERE no que existe (seleccione BookID de Sbook como cuadrados ,
donde cuadrados ~customid EQ Sbook ~ customid y cancel EQ 'X')
Ejemplo 11: operadores especiales

En todos los ejemplos anteriores slo hemos utilizado el 'EQ' (igual que el '=') y el
operador 'GT' (> =) para comparar los valores de los campos. Sin embargo, hay otros
ms complejos tambin.

ENTRE

Este operador es muy simple, es bsicamente "<=" y "> =" juntos.

Requisito de negocio: a excluir nicamente los clientes de nuestra lista, que tienen
unas reservas canceladas en el primer trimestre de 2005.

La sintaxis para esto es "campo ENTRE valor1 Y valor2".

Sugerencia : desde el punto de vista comercial se espera a ms clientes en el


conjunto de resultados, ya que excluimos menos clientes debido a una sub consulta
ms restrictiva.
Imagen 10: usando el operador BETWEEN. Como se puede ver, hay 21 clientes en
nuestra lista, por lo que hay un cliente que aparece de nuevo (tena cancelacin antes
o despus de la Q1 de 2005).

ME GUSTA

Esta expresin es una herramienta muy flexible para las comparaciones de cadenas
de caracteres en base a un patrn. El patrn puede definirse utilizando caracteres
comodn: "%" representa cualquier cadena de caracteres (incluso una vaca) y "_"
representa cualquier carcter individual. La expresin LIKE es sensible a maysculas
y caracteres en blanco al final del patrn son ignorados (como '__' es igual a gustar
'__').

Requisito de negocio (bastante extrao ...) : restringir nuestra lista, a raz slo
contienen los clientes con un nombre que empieza con "A".

Aadimos "nombre LIKE 'a%'" a la clusula WHERE para lograr este objetivo.
Imagen 11: utilizando el operador LIKE para filtrar la lista basndose en el nombre del
cliente.

Nota : Qu hacer si queremos buscar registros que contengan "_" en un campo


especfico?Dado que este es un smbolo reservado, tenemos que usar el ESCAPE
Adems, lo que permite un carcter de escape se puede definir. Este carcter de
escape cancela las funciones especiales de caracteres comodn (slo tiene que
colocar el carcter de escape antes de que el carcter comodn para ser cancelada).

Un ejemplo rpido: seleccionar todos los nmeros de materiales que contienen un


subrayado:

Enfoque equivocado (regresa cada nmero de material):


MATNR SELECT DE mara donde MATNR LIKE '% _%'

Buen enfoque:
MATNR SELECT DE mara donde MATNR LIKE '% _ ~%' ESCAPE '~'

Sugerencia : No es posible especificar un campo de tabla como un patrn.

Requisito de negocio (an ms extraa) : ahora queremos slo para ver a los clientes
con un nombre que empieza con "A" y tener 'd' como la tercera letra.
Imagen 12: utilizar el operador LIKE con ambos caracteres especiales "%" y
"_". Como se puede ver, todava tenemos tres clientes que coincidan con todos los
criterios de seleccin.

EN

Este operador le permite comparar un campo a un conjunto de valores fijos. Esto es


muy til, ya que puede sustituir a una ms larga y expresin mucho menos legible:

"Campo en ('01, '03, '05')" es igual a la mucho ms tiempo "campo EQ '01' o EQ


campo '02' o campo EQ '03'"

Requisito de negocio: extender nuestra seleccin a los clientes de American Airlines y


United Airlines tambin.

Imagen 13: utilizando el operador IN para contar las reservas de otras compaas
areas tambin.Como era de esperar, ahora tenemos muchos ms clientes que
coincidan con los criterios de seleccin menos restrictivas.

Nota : el operador IN se puede utilizar con una tabla de seleccin tambin, como se
ve en el captulo 17.

Ejemplo 12: Otras funciones de grupo

Hasta ahora slo hemos utilizado la funcin de grupo Contar para contar el nmero de
reservas que coincidan con los criterios de seleccin. Hay un total de cinco funciones
de grupo disponible en OpenSQL. Los cuatro restantes que no hemos visto todava
son todos los clculos matemticos: SUM, MIN, MAX y AVG que calcular el total,
mnimo, mximo y promedio de un campo, respectivamente.

Existen algunas restricciones relativas a la utilizacin de funciones de grupo:

Si la adicin de todas las entradas se utiliza en frente de donde, o si las tablas


de clster o agrupacin se enumeran despus de la DE, no hay otras
expresiones de agregado aparte de COUNT (*) se puede utilizar.

Columnas de la cadena tipo o RAWSTRING no se pueden utilizar con las


funciones de agregado.

Los valores nulos no se incluyen en el clculo de las funciones de agregado. El


resultado es un valor nulo slo si todas las filas de la columna en cuestin
contienen el valor nulo.
Requisito de negocio : el jefe quiere ver el total, promedio, mnimo y mximo del
precio de reserva para cada cliente (en la moneda de la lnea area).

Imagen 14: uso de todas las funciones de grupo (MIN, MAX, SUM, AVG, COUNT).

Nota : al igual que con la funcin COUNT, la palabra clave DISTINCT se puede
utilizar para llevar a cabo la funcin de grupo slo en valores distintos (por lo que el
resultado de la suma (a DISTINCT) para dos registros que tienen un valor en un
campo de 10 A sera 10).

Nota : el tipo de datos de AVG y SUM debe hacerse en forma numrica. El tipo de
datos del MIN, MAX y SUM es el tipo de datos del campo de la tabla correspondiente
en el Diccionario ABAP.Expresiones de agregado con la funcin AVG tener el tipo de
datos FLTP, y aquellos con RECUENTO tener el tipo de datos INT4.

Sugerencia : la herramienta que he utilizado para la demostracin sustituye a los


tipos de campo de estas funciones agregadas para una visualizacin ms fcil de
usar (en lugar de la notacin exponencial).
Ejemplo 13: subconsultas de la jerarquizacin

Subconsultas pueden anidarse que significa que usted puede poner una subconsulta
en la clusula WHERE de una subconsulta. Un mximo de diez sentencias SELECT
se permiten dentro de una consulta OpenSQL (una instruccin SELECT puede tener
un mximo de nueve subconsultas).
Requisito de negocio: excluir slo a los clientes que hayan cancelado las reservas en
el Q1 de 2005 y el lenguaje de la agencia de viajes es Ingls, donde se realiz la
cancelacin. Bastante incmoda, pero tena que averiguar algo

Podemos aplicar esta lgica utilizando una subconsulta anidada: aadimos este
criterio a la clusula WHERE de la subconsulta exterior (seleccionar todos los
nmeros de la agencia donde el idioma es el Ingls). Esto es diferente de nuestra sub
consulta previa, a causa de la palabra clave que utilizamos para evaluarla.

Las expresiones lgicas para subconsultas

- Existe: esto es lo que hemos utilizado en nuestro primer sub consulta. Esto devuelve
TRUE si la subconsulta devuelve todos los registros (uno o ms) en su conjunto de
resultados, de lo contrario esto devuelve FALSO.

- EQ, GT, GE, LT, LE: estos operadores se pueden utilizar para comparar un campo
con el resultado de la subconsulta. Si la sentencia devuelve ms de una fila,
obviamente, el motor de base de datos no sabr cul de ellos utilizar para la
comparacin: se producir una excepcin no capturable.

- Con el fin de utilizar subconsultas que devuelven varias filas, que o bien tiene que
utilizar el operador IN (comprueba si el campo es igual a cualquiera de los valores
devueltos por la subconsulta) o uno de los todos, cualesquiera, y algunas palabras
clave, junto con EQ , GT, GE, LT o LE. Estos influyen en la comparacin de una
manera bastante autoexplicativo: la comparacin se realiza con todos los registros
devueltos por la subconsulta, y la comparacin devolver TRUE si todo (ALL) o por lo
menos una (cualquiera, algunas) devuelven registros TRUE para la comparacin. No
hay ninguna diferencia entre las palabras clave some y any.

Qu resultado se espera? Desde nuestra sub consulta externa se usa para filtrar los
clientes con reservas canceladas, una subconsulta menos restrictivo (que se logra por
la subconsulta anidada) significara ms clientes en nuestra lista. Prcticamente: las
agencias menos que incluimos en nuestra bsqueda de cancelaciones, ms clientes
que obtienen en la lista.
Imagen 15: subconsultas de anidacin. Como se puede ver, en realidad tenemos un
cliente ms en nuestra lista, que cancel su reserva en una agencia donde el idioma
no es el Ingls.

Ejemplo 14: HAVING y GROUP BY en una subconsulta

Requisito de negocio: solamente excluir a los clientes que tienen al menos tres
cancelaciones (de Lufthansa en el Q1 de 2005 a una agencia de habla Ingls).

Ya que tenemos que contar el nmero de estas reservas, tenemos que utilizar la
funcin COUNT grupo y el grupo de las reservas por el ID de cliente. De esta forma
obtenemos el nmero de bsqueda de reservas por cliente. A continuacin, slo
tenemos que aadir la clusula HAVING para asegurarse de que slo se excluya a los
clientes que tienen ms de dos cancelaciones de nuestro consulta principal.

Podemos esperar a tener ms clientes en nuestro conjunto de resultados, ya que


tenemos una sub consulta ms restrictiva que utilizamos para filtrar los clientes.
Imagen 16: usando el GROUP BY y HAVING en una subconsulta. Como se puede ver,
tenemos dos ms clientes en nuestra lista (que tienen uno o dos juego cancelado las
reservas).

Ejemplo 15: Vamos a extender la clusula GROUP BY

Requisito de negocio: incluir slo los clientes que tienen ms de 10 reservas para la
misma compaa area. No importa cual, pero debera ser ms de diez.

Hasta ahora hemos contado todas las reservas de los clientes que satisfacen todos
los criterios (por ejemplo, con ms de 10 reservas de cualquier lnea area). Esto
podra ser como alguien que tiene 5 reservas para Lufthansa, 5 para American Airlines
y 2 para United Airlines (siendo el total mayor de 10). Ahora queremos ver algo como
11 para Lufthansa.

Es muy simple de resolver esto aadiendo el cdigo de lnea area (CARRID) a la


lista de campos de nuestra consulta principal. Recuerde, el motor de base de datos
crear grupos de registros en base a todos los campos de la lista antes de la primera
funcin de grupo en la lista de campos (clusula SELECT). Si aadimos el cdigo de
lnea area aqu, los grupos sern hechos por compaas areas para cada cliente y
la funcin COUNT contarn el nmero de reservas por cliente y la compaa area.

Qu cambios esperamos en nuestro conjunto de resultados? No debera ser mucho


menos clientes en nuestra lista, porque deben tener ms de diez reservas para la
misma compaa area.
Imagen 17: aadir el ID de soporte a la clusula GROUP BY (y la clusula SELECT
tambin).

El resultado muestra exactamente esto: slo tenemos tres clientes (muy fieles) que
responden a los criterios de seleccin. Observe que el mayor nmero de reservas es
ahora slo 12, mientras que en el ejemplo anterior fue de 19.

Ejemplo 16: Volviendo a la combinacin externa izquierda

Para tener unas coordenadas que aparecen en la lista de resultados, hacemos dos
cambios:

- Cambiar la condicin WHERE de la consulta principal: en lugar de comprobar el


nombre del cliente y el cdigo de lnea area, seleccionamos los clientes de los
EE.UU.. De esta manera vamos a tener mucho ms clientes en nuestra lista (100 que
est limitada por la HASTA N filas adicin) y puesto que son de los EE.UU., vamos a
ver algunos cdigos de regin para los clientes (coordenadas se mantienen para las
regiones de Estados Unidos) .

- Eliminar la clusula HAVING para incluir a los clientes con menos de 11 reservas a
juego.
Imagen 18: primer cambio: la eliminacin de la verificacin para que al menos diez
reservas.

Imagen 19: segundo cambio: seleccione los clientes de los EE.UU..

Ahora se puede ver una vez ms el comportamiento de la combinacin externa


izquierda: coordenadas estn llenos de todos los registros, donde se llena el cdigo
de regin y se encuentran las coordenadas para la regin en GEOT005S mesa.

Ejemplo 17: Uso de una mesa de seleccin en la clusula WHERE


Tablas de seleccin se utilizan para definir selecciones complejas en un campo. Se
utilizan sobre todo junto con pantallas de seleccin (mediante instruccin SELECT-
OPTION). Cualquier seleccin que el usuario realiza en la interfaz de usuario se
convierte en una expresin lgica compleja utilizando los operadores que los que
hemos trabajado en este tutorial (EQ, GT, LE, GE, LT, NE, ENTRE, NO, etc.). Esta
conversin se realiza por el motor OpenSQL automticamente.

Con el fin de comparar los valores de un campo de tabla con una mesa de seleccin,
usted tiene que utilizar el operador "IN".

Requisito de negocio: slo se cuentan las reservas de Business Class y Economy


Class ( 'C' y 'Y') en un rango de tiempo complejo.

Imagen 20: realizar selecciones complejas utilizando tablas de seleccin. Ntese la


palabra clave "IN" se utiliza como un operador de comparacin.

Nota : la herramienta utilizada para esta demostracin ofrece una interfaz de usuario
para definir las tablas de seleccin como en las pantallas de seleccin. Adems, la
clusula WHERE generada es visible en el lado derecho, junto a las tablas de
seleccin R_SBOOK_FLDATE y R_SBOOK_CLASS.

Ejemplo 18: El "para todas las entradas" construir

Este constructo se utiliza ampliamente en ABAP y es similar a una tabla de unin de


manera que se utiliza para leer datos de una tabla para los registros que ya tenemos
(selecciona tpicamente de otra tabla o devuelto por un mdulo de funcin). Sin
embargo, hay grandes diferencias entre las dos construcciones.
El "para todas las entradas en la tabla interna" constructo le permite utilizar una tabla
interna como la base de su seleccin, pero no como una mesa de seleccin del
Ejemplo 17. Si utiliza esta adicin, puede (en realidad, debe) se refieren a la campos
de la tabla interna en el de todas las entradas en la clusula para realizar la
comparacin con los campos de la tabla (s) de base de datos que se
lee. Naturalmente, los campos utilizados en la comparacin deben tener tipos de
datos compatibles.

Como esta construccin es ABAP especfica, existe un mecanismo que traduce el


comando OpenSQL a una o ms sentencias SQL nativas. En realidad, se generar la
clusula WHERE (es) que se pasa al motor de base de datos basado en el contenido
de la tabla interna y la clusula WHERE que defina. Hay varios parmetros del perfil
que influyen en esta conversin, que se puede comprobar en la nota SAP 48230 -
parametrizacin para SELECT ... FOR ALL comunicado ENTRADAS .

La principal diferencia entre la mesa y se une a esta construccin es que se une a la


mesa se llevan a cabo por el servidor de base de datos y todos los datos se pasan al
servidor de aplicaciones a la vez. Por otro lado, en caso de todas las entradas en
construccin, la totalidad de los que se evalan clusula para cada fila individual de la
tabla interna. El conjunto de resultados de la instruccin SELECT es la unin de los
conjuntos de resultados producidos por las evaluaciones individuales. Es muy
importante tener en cuenta que los registros duplicados se eliminan automticamente
de la hoja de resultados (pero en el servidor de aplicaciones y no en el servidor de
base de datos).

Sintcticamente, hay una diferencia que usted tiene que utilizar el signo - en lugar de
la "~" seal entre el nombre de la tabla interna y el nombre del campo de la tabla
interna en la clusula WHERE "".

Nota muy importante : Si la tabla de referencia interna est vaca, la totalidad


DONDE se ignora la clusula y todas las lneas de la base de datos se colocan en el
conjunto de resultados.Siempre hacer una verificacin en la tabla interna antes de
ejecutar una consulta de seleccin utilizando esta construccin.

Requisito de negocio: leer la informacin de avin para todas las compaas areas
que aparecen en nuestra lista.

Cmo implementar esto? Ya tenemos una instruccin SELECT del ejemplo anterior,
por lo que creamos una segunda instruccin SELECT utilizando el para todas las
entradas constructo. Basta con aadir el ID de soporte como un link en la clusula
WHERE (similar a la condicin de unin en caso de uniones de tablas) y eso es todo.
Imagen 21: uso de la "para todas las entradas en la tabla interna" constructo.

Nota : la herramienta que he utilizado para la demostracin utiliza "outer_table" como


el nombre de la tabla interna. Los contenidos de la misma son procedentes de la
consulta de seleccin del ejemplo 17.

Nota : A partir del comunicado de 6,10, la misma tabla interna puede ser especificado
despus para todas las entradas y despus de EN. Sin embargo, tenga cuidado ya
que en este caso se borrarn todos los campos de la tabla interna que no estn
cubiertas por la consulta SELECT.

Nota : En cuanto al rendimiento hay un sinfn de debates sobre SCN si una tabla de
unin o el para todas las entradas constructo es mejor. Realmente depende de la
configuracin de tampn de los cuadros seleccionados en los campos que utiliza para
las uniones y las selecciones, los ndices que estn disponibles, el nmero de
registros en ambas tablas, los parmetros del perfil del sistema SAP, etc. En general
prefiero une ya que es una "herramienta" que est diseado especialmente para el
propsito de la lectura de datos desde mltiples tablas al mismo tiempo y que se
realiza en la capa de base de datos. Por supuesto ciertas situaciones estn en contra
de una tabla de unin. Adems, no tienen otra opcin si se utiliza un mtodo de
mdulo / Clase BAPI / Funcin para obtener los registros de la base de datos, ya que,
obviamente, en ese caso no se puede utilizar una tabla de unin, pero hay que usar el
para todas las entradas constructo.

otras palabras clave

SIMPLE y FOR UPDATE


Si utiliza la adicin nica, el conjunto de resultados contendr un registro mximo. Si
las clusulas restantes de la instruccin SELECT volveran ms de una lnea, slo el
primero ser devuelto.

La adicin UPDATE slo se puede utilizar con la adicin individual, que se puede
utilizar para configurar un bloqueo exclusivo para el registro seleccionado. Sin
embargo, esto rara vez se utiliza y tambin prefiero el uso de mdulos de funcin de
bloqueo por separado.

Nota : No se permite la adicin nica en una sub consulta y la clusula ORDER BY no


se puede utilizar junto con l.

cliente especificado

Esta adicin se apaga el manejo automtico de clientes de Open SQL. Cuando se


utiliza el CLIENTE Adems especificado, la primera columna de las tablas de la base
de clientes dependiente se puede especificar en el WHERE y ORDER BY clusulas.

ANULACIN DE BUFFER

Esta adicin hace que la instruccin SELECT para eludir SAP bfer y leer
directamente desde la base de datos y no desde el bfer en el servidor de
aplicaciones.

ENDSELECT

Una instruccin SELECT puede recuperar los registros de base de datos uno por uno
(que funciona como un bucle usando la palabra clave INTO), o junto a la vez (esto se
denomina "matriz de recuperacin" y se utiliza con la palabra clave INTO TABLE
TABLA / Anexin). En el primer caso la declaracin ENDSELECT cierra el ciclo
iniciado con SELECT. Ambas construcciones recuperar el mismo resultado.

Fuera del alcance de esta entrada del blog

consejos de base de datos

Bsicamente el uso de sugerencias se utiliza para especificar cmo el motor de base


de datos debe ejecutar nuestra consulta. Si se omite, entonces el motor de base de
datos utilizar su propia optimizador para determinar la mejor estrategia para ejecutar
la instruccin SELECT. Utilizacin de las sugerencias para anular esta estrategia por
defecto es bastante frecuente fuera de SAP, pero rara vez se utiliza con ABAP.

Una de las razones es que muchos desarrolladores no saben que es posible utilizar
las sugerencias con declaraciones OpenSQL (no slo con los nativos). Adems, hay
ciertos inconvenientes (problemas durante la actualizacin del DB o cambio de
servidor de base de datos) y hay ms posibilidad de errores humanos.

Hay una muy buena visin de conjunto de consejos de base de datos en la nota
SAP 129385 - consejos de base de datos en SQL abierto
especificacin dinmica de tokens

Es posible montar declaraciones OpenSQL durante el tiempo de ejecucin. As que en


lugar de codificar una instruccin SELECT esttico, puede utilizar variables de tipo
carcter para sostener el SELECT, FROM, WHERE, etc. clusulas. Esto puede ser til
en ciertos casos, pero tiene desventajas con respecto al rendimiento, facilidad de
mantenimiento y la legibilidad del cdigo.Adems, hay ciertos dependientes de
liberacin SAP restricciones sobre los elementos de sintaxis permitidos. Hay algunos
materiales agradables en SCN y otros sitios que se ocupan de este tema.

Conclusin

Como se puede ver, a pesar de Open SQL es un subconjunto muy limitado del
lenguaje SQL moderna, todava le permite ejecutar consultas bastante complejas. En
la mayora de los casos toda la lgica de negocio de un informe complejo no puede
ser asignada a una sola consulta de seleccin, sin embargo, si usted sabe lo que tiene
posibilidades, se puede escribir mucho ms elegante y compacto cdigo de programa
con un mejor rendimiento.

Gracias por leer y divertirse usando Open SQL.

Adems moderador - el comentario a continuacin aade enlaces a informacin muy til hasta
a la fecha.
Thomas Fiedler 28 de de mayo de, 2014 8:48
Hola Tamas,

muy buena visin general sobre el tema Open SQL. Hay mucho ms en el camino
que viene en el noroeste de 7,40. All hicimos un gran paso adelante en relacin
con SQL en ABAP, por ejemplo, una nueva herramienta completa para definir vistas
de bases de datos:

Nueva modelado de datos en SAP NW Caractersticas ABAP 7.4 SP5


Y tambin en el lado herramientas que tenemos mucho ms. Sabe usted las
herramientas de ABAP basadas en Eclipse con la vista previa de datos para las
tablas de base de datos?

Presentacin de vista previa de datos en ADT 2.19

Saludos cordiales,
Thomas.

You might also like