目录
为了进行测试我在SAP GUI中新建了两张测试表内容如下:
一、内链接
JOIN或INNER JOIN
JOIN和INNER JOIN是完全等价的,区别在于INNER JOIN是显式写法,JOIN是隐式写法
结果取链接两表的交集
例子:
define view ZDEMO_CDS_01 // ABAP 程序里使用的名字
as select from ztcds_sql1 as a
join ztcds_sql2 as b
on a.id = b.id
{
a.id as a_Id,
a.name as Name,
b.cid as Cid,
b.cname as Cname,
b.id as b_Id
}
运行结果:
二、外连接
1.LEFT JOIN 或者 LEFT OUTER JOIN
区别同上,值得注意的是CDS 只能使用LEFT OUTER JOIN
返回结果为左表全数据,与右表数据进行匹配,未匹配到则为空
例子:
define view ZDEMO_CDS_01 // ABAP 程序里使用的名字
as select from ztcds_sql1 as a
left outer join ztcds_sql2 as b
on a.id = b.id
{
a.id as a_Id,
a.name as Name,
b.cid as Cid,
b.cname as Cname,
b.id as b_Id
}
运行结果:
2.RIGHT JOIN 或 RIGHT OUTER JOIN
区别同上,值得注意的是CDS 只能使用RIGHT OUTER JOIN
返回结果为右表全数据,与左表数据进行匹配,未匹配到则为空
例子:
define view ZDEMO_CDS_01 // ABAP 程序里使用的名字
as select from ztcds_sql1 as a
right outer join ztcds_sql2 as b
on a.id = b.id
{
a.id as a_Id,
a.name as Name,
b.cid as Cid,
b.cname as Cname,
b.id as b_Id
}
运行结果:
3.FULL OUTER JOIN
CDS VIEW不能使用,不写了
4.CROSS JOIN
每一条数据都会与另外表的所有数据进行连接
注意:使用CROSS JOIN时无法使用ON指定连接条件
例子:
define view ZDEMO_CDS_01 // ABAP 程序里使用的名字
as select from ztcds_sql1 as a
cross join ztcds_sql2 as b
{
a.id as a_Id,
a.name as Name,
b.cid as Cid,
b.cname as Cname,
b.id as b_Id
}
运行结果:
三、嵌套JOIN
1.明确的嵌套(SAP推荐的写法,可读性好)
例子:
define view ZDEMO_CDS_01 // ABAP 程序里使用的名字
as select from scarr as a
left outer join( sairport as p
left outer join scounter as c
on p.id = c.airport )
on a.carrid = c.carrid
{
a.carrid,
p.id,
c.countnum
}
运行结果:
嵌套执行的顺序:先执行括号最里面的,也就是说P和C先链接,再与A链接
2.模糊嵌套(不推荐,可读性差)
例子:
define view ZDEMO_CDS_01 // ABAP 程序里使用的名字
as select from scarr as a
left outer join sairport as p
left outer join scounter as c
on p.id = c.airport
on a.carrid = c.carrid
{
a.carrid,
p.id,
c.countnum
}
运行结果:
嵌套的执行顺序:ON出现的顺序,上面先出现ON P.ID = C.AIRPORT
所以P和C先链接,再与A链接
四、UNION和UNION ALL
1.UNION
把两个结果集的行上下堆在一起,并去除重复的行
注意:
1)上下两个结果集的列的类型要可兼容
2)取的列数量要一样,名字要相同(可以取别名)
3)可以用别名,检索不同的字段
UNION后的结果集属性:
1)列的名字、类型与第一个集一致
2)KEY与第一个结果集,忽略第二个结果集
注意:如果第二个结果集的类型是char(20),而第一个结果集的类型是char(10),则最后结果集的类型是char(10),多余的会被截断
2.UNION ALL
与UNION相同,区别在于不去除重复行
例子:
define view ZDEMO_CDS_01 // ABAP 程序里使用的名字
as select from scustom
{
id,
'Customer' as type,
name,
city,
country
} where country = 'DE'
and id between '00000090' and '00000100'
union
select from stravelag
{
agencynum as id,
'Agencyaaaaaa' as type,
name,
city,
country
} where country = 'DE'
and agencynum < '00000100'
运行结果: