Professional Documents
Culture Documents
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:
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.
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.
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.
uniones de tablas
Requisito de negocio : leer datos de los clientes de SCUSTOM mesa para el cliente
de cada reserva.
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).
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.).
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.
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".).
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.
Imagen 5: una funcin simple grupo contando el nmero de reservas que coincidan
con los criterios de seleccin.
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.
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.
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.
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: 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.
Que hacemos ahora? Nos ordenar la lista por el resultado de la funcin COUNT en
orden descendente y luego por el nombre del cliente.
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.
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.
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
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.
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 :
ejemplo simplificado:
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
Requisito de negocio: a excluir nicamente los clientes de nuestra lista, que tienen
unas reservas canceladas en el primer trimestre 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.
Buen enfoque:
MATNR SELECT DE mara donde MATNR LIKE '% _ ~%' ESCAPE '~'
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
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.
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.
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.
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.
- 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.
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.
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.
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.
Para tener unas coordenadas que aparecen en la lista de resultados, hacemos dos
cambios:
- 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.
Con el fin de comparar los valores de un campo de tabla con una mesa de seleccin,
usted tiene que utilizar el operador "IN".
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.
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 "".
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 : 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.
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.
cliente especificado
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.
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
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.
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:
Saludos cordiales,
Thomas.