ABAP’ta birden fazla tablodan veri çekmenin en doğru ve performanslı yollarından biri Open SQL’de JOIN kullanmaktır. JOIN sayesinde iki (veya daha fazla) tabloyu tek bir SELECT içinde birleştiririz. Böylece ABAP tarafında gereksiz LOOP + READ TABLE işlemleri azalır ve genelde daha hızlı sonuç alınır.
Bu yazıda en çok kullanılan JOIN tiplerini (INNER JOIN, LEFT OUTER JOIN ve RIGHT OUTER JOIN) pratik örneklerle göreceğiz. Örnekleri günlük hayatta daha sık kullanılan bir senaryoya çekmek için MARA (Materyal Genel) ile MARC (Materyal Tesis) tabloları üzerinden gideceğiz.
1) JOIN nedir?
JOIN, iki tabloyu ortak bir alan üzerinden eşleştirip tek bir sonuç seti üretir. Örneğin:
- MARA: Materyalin genel bilgileri (
MATNR,MTART,MATKLvb.) - MARC: Materyalin tesis (
WERKS) bazlı bilgileri (DISPO,BESKZvb.)
Bu iki tabloyu MATNR üzerinden birleştirmek gibi düşünebilirsin.
2) INNER JOIN (en sık kullanılan)
INNER JOIN sadece iki tabloda da eşleşen kayıtları getirir. Yani “materyal var ve bu materyalin ilgili tesiste MARC kaydı var” demektir.
Örnek: MARA + MARC (sadece eşleşen kayıtlar)
TYPES: BEGIN OF ty_mat,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
matkl TYPE mara-matkl,
werks TYPE marc-werks,
dispo TYPE marc-dispo,
beskz TYPE marc-beskz,
END OF ty_mat.
DATA lt_mat TYPE STANDARD TABLE OF ty_mat WITH EMPTY KEY.
SELECT a~matnr,
a~mtart,
a~matkl,
b~werks,
b~dispo,
b~beskz
FROM mara AS a
INNER JOIN marc AS b
ON b~matnr = a~matnr
INTO TABLE @lt_mat
UP TO 50 ROWS.
Ne döner?
- MARA kaydı olup aynı
MATNRiçin MARC kaydı olan satırlar gelir. - MARC kaydı yoksa o materyal sonuçta görünmez.
3) LEFT OUTER JOIN
LEFT OUTER JOIN “soldaki tabloyu” baz alır. Sağ tablo eşleşmese bile sol tablo kaydı gelir; sağ tablonun alanları INITIAL (boş) olur.
Ne zaman kullanılır?
- “Tüm materyaller listelensin, seçtiğim tesiste MARC kaydı yoksa da materyal gelsin.”
Örnek: MARA LEFT JOIN MARC (MARC yoksa da MARA gelsin)
Not: LEFT JOIN’i “tesise göre” anlamlı yapmak için çoğu zaman WERKS filtresini JOIN koşuluna koymak daha doğrudur.
TYPES: BEGIN OF ty_left,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
matkl TYPE mara-matkl,
werks TYPE marc-werks,
dispo TYPE marc-dispo,
END OF ty_left.
DATA lt_left TYPE STANDARD TABLE OF ty_left WITH EMPTY KEY.
DATA lv_werks TYPE marc-werks VALUE '1000'. "Örnek tesis
SELECT a~matnr,
a~mtart,
a~matkl,
b~werks,
b~dispo
FROM mara AS a
LEFT OUTER JOIN marc AS b
ON b~matnr = a~matnr
AND b~werks = @lv_werks
INTO TABLE @lt_left
UP TO 50 ROWS.
Bu sorguda:
- Her MARA kaydı gelir.
- İlgili materyal için MARC’ta
WERKS = 1000kaydı yoksab~werksveb~dispoboş gelir.
4) RIGHT OUTER JOIN
RIGHT OUTER JOIN “sağdaki tabloyu” baz alır. Yani sağ taraftaki tablo (JOIN’den sonra yazılan) kaydı eşleşmese bile sonuç setine gelir; soldaki tablonun alanları eşleşme yoksa INITIAL olur.
Ne zaman kullanılır?
- “Tesis bazlı materyal kayıtlarını (MARC) baz al, genel materyal kaydı (MARA) olmasa bile satır gelsin” gibi durumlarda.
- Pratikte MARC kaydı varsa genelde MARA da vardır; yani RIGHT JOIN çoğu sistemde az kullanılır ama mantığı bilmek faydalıdır.
Örnek: MARA RIGHT JOIN MARC (MARC bazlı sonuç)
TYPES: BEGIN OF ty_right,
werks TYPE marc-werks,
matnr TYPE marc-matnr,
dispo TYPE marc-dispo,
mtart TYPE mara-mtart,
matkl TYPE mara-matkl,
END OF ty_right.
DATA lt_right TYPE STANDARD TABLE OF ty_right WITH EMPTY KEY.
DATA lv_werks TYPE marc-werks VALUE '1000'.
SELECT b~werks,
b~matnr,
b~dispo,
a~mtart,
a~matkl
FROM mara AS a
RIGHT OUTER JOIN marc AS b
ON b~matnr = a~matnr
AND b~werks = @lv_werks
INTO TABLE @lt_right
UP TO 50 ROWS.
5) JOIN ile WHERE kullanımı (performans için kritik)
JOIN sorgularında WHERE filtresi koymak çok önemlidir. Filtreyi ABAP’ta yapmak yerine veritabanına bırakmak genelde daha performanslıdır.
Örnek: Belirli materyal tipi için filtre
SELECT a~matnr,
a~mtart,
b~werks,
b~dispo
FROM mara AS a
INNER JOIN marc AS b
ON b~matnr = a~matnr
INTO TABLE @DATA(lt_filtered)
WHERE a~mtart = @'FERT'
UP TO 100 ROWS.
6) Aynı isimli alanlar ve alias kullanımı
JOIN’de iki tabloda aynı isimli alanlar olabilir. Bu yüzden:
- Tablo alias kullanmak (
AS a,AS b) - Alanları
a~veb~ile açıkça belirtmek
en temiz yaklaşımdır.
7) JOIN mi, FOR ALL ENTRIES mi?
Genel pratik:
- İlişki netse ve tek sorguda çözülebiliyorsa: JOIN genelde daha iyi
- Özel senaryolarda:
FOR ALL ENTRIESkullanılabilir (ama boş tablo tuzağına dikkat)
Sonuç
ABAP Open SQL’de JOIN kullanmak kodu sadeleştirir ve çoğu durumda performansı iyileştirir:
- INNER JOIN: sadece eşleşen kayıtları getirir
- LEFT OUTER JOIN: sol tabloyu baz alır, eşleşme olmasa da sol kaydı getirir
- RIGHT OUTER JOIN: sağ tabloyu baz alır, eşleşme olmasa da sağ tablo kaydı gelir
ABAP’ta Open SQL’in nasıl kullanıldığını öğrenmek için bu yazıyı inceleyebilirsiniz.
Link: https://www.mustafahamit.com/abap-open-sql-select-into-where-join/
![]()