PDA

Ver la Versión Completa : Duda con consulta SQL en abap


uo4396
13/01/09, 11:33:05
Hola a todos.

Queria saber si el sql de abap soporta los conjuntos. Es decir, si hay alguna manera de hacer la siguiente consulta

select *
from tabla_A
where tabla-campo not in ( select campo
from tabla_B )

Muchas gracias a todos

gugutin
13/01/09, 14:54:02
Hola,

select *
from tabla_A
where tabla-campo not in ( select campo
from tabla_B )

Yo creo que si pones un ranges para campo tabla_b y lo llenas previamente,

RANGES: RNG_campo FOR tabla_b-campo.

RNG_campo-SIGN = 'E'
RNG_campo-OPTION = 'EQ'.
RNG_campo-LOW = tabla_b-campo.
RNG_campo-HIGH = SPACE.

APPEND RNG_campo.

luego la instruccion seria

select * from tabla_A
where tabla-campo in RNG_campo.

No estoy seguro si es esta tu pregunta, espero haberte podido ayudar.

Saludos

melerogalan
13/01/09, 16:58:34
Una posible solución evitando sentencias negativas en los SELECTs, seria.

Seleccionar todos los registros de la TABLA A.

SELECT * FROM TABLA A
INTO TABLE I_TABA

Con esta tabla accedemos a la TABLA B.

SELECT * FROM TABLA B
INTO TABLE I_TABB
FOR ALL ENTRIES IN I_TABA
WHERE campo = I_TABA-campo

Recorremos la TABLA A y eliminamos los registros que esten en la TABLA B.

LOOP AT I_TABA.

L_TABIX = SY-TABIX.
READ TABLE I_TABB WITH KEY campo = I_TABA-campo
IF sy-subrc EQ 0. "Esta en la tabla B

* Borramos el registro de la I_TABA.
DELETE I_TABA INDEX L_TABIX.

ENDIF.

ENDLOOP.


En la TABLA A tenemos los registros que no esta en la TABLA B.


Creo que es esto lo que buscas.

uo4396
13/01/09, 20:27:46
Gracias a los dos.
En cuanto a la primera solución no me vale porqué con el rango me coge todos los valores comprendidos entre el mayor y el menor y yo no necesito todos sino unos cuantos dentro de ese rango.
La segunda solución es la que he pensado yo lo q pasa que quería ver la forma de realizarlo en una única consulta SQL y no tener que hacer loops a tablas internas.

Muchas gracias de nuevo

bisonye
14/01/09, 06:17:46
Gracias a los dos.
En cuanto a la primera solución no me vale porqué con el rango me coge todos los valores comprendidos entre el mayor y el menor y yo no necesito todos sino unos cuantos dentro de ese rango.
La segunda solución es la que he pensado yo lo q pasa que quería ver la forma de realizarlo en una única consulta SQL y no tener que hacer loops a tablas internas.

Muchas gracias de nuevo

En un rango puedes indicarle valores individuales, rangos, excluir valores individuales, exluir rangos, mayor, menor, etc, etc.

Revisa los campos Sign y Option.

Saludos

melerogalan
14/01/09, 07:16:38
Gracias a los dos.
En cuanto a la primera solución no me vale porqué con el rango me coge todos los valores comprendidos entre el mayor y el menor y yo no necesito todos sino unos cuantos dentro de ese rango.
La segunda solución es la que he pensado yo lo q pasa que quería ver la forma de realizarlo en una única consulta SQL y no tener que hacer loops a tablas internas.

Muchas gracias de nuevo

Por eficiencia es mejor hacer un loops simple a una tabla interna que utilizar rangos con sentencias negativas. Hay que evitar los accesos a Base de datos lo máximo posible porque es lo que mas recursos consume.

Saludos.