SAP NetWeaver AS ABAP Release 752, ©Copyright 2017 SAP AG. All rights reserved.
ABAP - Keyword Documentation → ABAP - Reference → Processing External Data → ABAP Database Accesses → Open SQL → Open SQL - Reads → SELECT clauses → SELECT - FROM →
SELECT - JOIN
Syntax
... [(] {
data_source [AS tabalias]}|join
{[INNER] JOIN}|{LEFT|RIGHT [OUTER [MANY TO ONE]] JOIN}|{CROSS JOIN}
{
data_source [AS tabalias]}|join [ON
sql_cond] [)] ... .
Extras:
1. ... ON sql_cond
2. ... MANY TO ONE
Effect
Joins the columns of two or more data sources in a results set of a query in a join expression. A join expression joins a left side with a right side, using
Every join expression for an inner or outer join must contain a join condition sql_cond after ON (see below). A join expression for a cross join cannot contain any join conditions.
The following applies to entries specified on the left side and on the right side:
The priority in which nested join expressions are evaluated is specified as follows:
Results set for inner joins
In a single results set, an inner join joins the columns of the rows in the results set of the left
side with the columns of the rows in the results set of the right side. This results set contains all
combinations of rows for whose columns the join condition
sql_cond is jointly true. If there are no rows in the results set of the left and right sides that meet sql_cond, a row is not created in the resulting results set.
Results set for outer joins
The outer join creates the same results set as the inner join. The difference is that, for each selected
row on the left side as LEFT OUTER JOIN or on the right side as RIGHT
OUTER JOIN, at least one row is created in the results set, even if no rows on the other side
meet the condition sql_cond. The columns on the other side that do not meet the condition sql_cond are filled with
null values.
Results set for cross join
The cross join forms a cross product of the results set of the left side and the results set of the right side. The cross join joins the columns of the rows in the results set of the left side with the columns of the rows in the results set of the right side. This results set contains all possible combinations of rows. The number of rows in the results set of the cross join is the product of the number of rows of both joined results sets.
Notes
Example
Join of the columns carrname, connid, and fldate of the database tables scarr, spfli, and sflight using two inner joins. This creates a list of flights from cityfr to cityto. An alias name is assigned to each table.
DATA:
cityfr TYPE spfli-cityfrom VALUE 'FRANKFURT',
cityto TYPE spfli-cityto VALUE 'NEW YORK'.
cl_demo_input=>new(
)->add_field( CHANGING field = cityfr
)->add_field( CHANGING field = cityto )->request( ).
SELECT c~carrname, p~connid, f~fldate
FROM ( ( scarr AS c
INNER JOIN spfli AS p ON p~carrid = c~carrid
AND p~cityfrom = @cityfr
AND p~cityto = @cityto )
INNER JOIN sflight AS f ON f~carrid = p~carrid
AND f~connid = p~connid )
ORDER BY c~carrname, p~connid, f~fldate
INTO TABLE @DATA(itab).
Example
Joins the database tables scarr and spfli using a left outer join. For all flights not departing from cityfr, the value of the column connid is the null value. The WHERE condition causes all airlines to be displayed that do not fly from cityfr.
DATA cityfr TYPE spfli-cityfrom VALUE 'FRANKFURT'.
cl_demo_input=>request( CHANGING field = cityfr ).
SELECT s~carrid, s~carrname
FROM scarr AS s
LEFT OUTER JOIN spfli AS p ON s~carrid = p~carrid
AND p~cityfrom = @cityfr
WHERE p~connid IS NULL
ORDER BY s~carrid, s~carrname
INTO TABLE @DATA(itab).
cl_demo_output=>display( itab ).
Example
Cross join of the table T000 of all clients of an AS ABAP with the entries for the message classSABAPDEMOS in the table T100. Without the WHERE condition, the results set would be very large.
DATA BEGIN OF wa.
DATA mandt TYPE t000-mandt.
DATA mtext TYPE t000-mtext.
INCLUDE TYPE t100.
DATA END OF wa.
DATA itab LIKE STANDARD TABLE OF wa WITH EMPTY KEY.
SELECT t000~mandt, t000~mtext, t100~*
FROM t000 CROSS JOIN t100
WHERE t100~arbgb = 'SABAPDEMOS'
ORDER BY t000~mandt, t100~sprsl, t100~msgnr
INTO TABLE @itab.
cl_demo_output=>display( itab ).
... ON sql_cond
Effect
Join condition. A join condition must be specified for an inner or outer join. A join condition does not have to be specified for a cross join.
The syntax of a join condition sql_cond is subject to the following restrictions:
A join condition is met if the logical expression sql_cond is true.
The client column of a client-specific data source can only be used in the ON condition if automatic client handling is switched off using the addition CLIENT SPECIFIED. This is checked in full in the strict modes of the syntax check from Release 7.40, SP05.
Notes
Executable Examples
MANY TO ONE
Effect
Specifies the cardinality of a left outer join. This addition is positioned after LEFT OUTER, but is not possible after RIGHT OUTER. Only certain specific database systems apply this addition.
If the addition MANY TO ONE is specified, any databases that support this addition assume that the results set defined by the left outer join matches this cardinality and SQL Optimizer attempts to suppress any surplus joins. If the results set does not match the cardinality, the result is undefined and may be dependent on the entries in the SELECT list.
Notes
Example
Incorrect use of MANY TO ONE. The data in the database tables SCARR and SPFLI do not have the cardinality MANY TO ONE and have the reverse cardinality instead. On a SAP HANA database, for example, the result is dependent on the SELECT list. If the left and right side are specified here, no optimization takes place. If no columns are specified on the right side (and the aggregate function COUNT(*) is used), an optimization takes place. Here, only that data is read that meets the prerequisite cardinality.
DATA(out) = cl_demo_output=>new( ).
out->next_section( `Fields of left and right table` ).
SELECT FROM scarr AS c
LEFT OUTER MANY TO ONE JOIN spfli AS p
ON c~carrid = p~carrid
FIELDS c~carrid AS carrid,
c~carrname AS carrname,
p~connid AS connid
ORDER BY c~carrid
INTO TABLE @DATA(itab).
out->write( itab ).
out->write( sy-dbcnt ).
out->next_section( `Fields of left table only` ).
SELECT FROM scarr AS c
LEFT OUTER MANY TO ONE JOIN spfli AS p
ON c~carrid = p~carrid
FIELDS c~carrid AS carrid,
c~carrname AS carrname
ORDER BY c~carrid
INTO CORRESPONDING FIELDS OF TABLE @itab.
out->write( itab ).
out->write( sy-dbcnt ).
out->next_section( `COUNT(*)` ).
SELECT FROM scarr AS c
LEFT OUTER MANY TO ONE JOIN spfli AS p
ON c~carrid = p~carrid
FIELDS COUNT( * ) AS count
INTO @DATA(count).
out->write( count ).
out->display( ).
Inner, Outer, and Cross Joins
Multiple Joins