AS400 SQL 中的 JOIN不同关联类型小结
下面是 AS400 SQL 中的 JOIN不同关联类型小结和差异 提供大家参考,SQL虽然在AS400上性能不是最好的,的确有时候很有效方便使用,更详细请要参考AS400 SQL 红皮书
综述:SQL JOIN类型分INNER,LEFT,RIGHT,EXCEPTION,CROSS不同类似
举例的例子左表XQ05是定义指定LOC的权限,右表XI30是LOC的名称定义表:
WRKDBF工具中XQ05字段定义
Seq. Base PF Field Name Field Description Key Tp Pos Len Dec
1.0 XQ05 USR User ID 1 A 1 10
2.0 APP Application 2 A 11 2
3.0 FUN Function 3 A 13 10
4.0 CPY Company code 4 A 23 4
5.0 LOC Location 5 A 27 4
6.0 USRRGT User right A 31 6
7.0 FILLER001 A 37 12
XI30字段定义:
Seq. Base PF Field Name Field Description Key Tp Pos Len Dec
1.0 XI30 LOC Location 1 A 1 4
2.0 INAIND Inactive Indicator A 5 1
3.0 LOCNAM Location name A 6 30
INNER JOIN:LEFT左表关联RIGHT右表所有和右表match的记录。以LOC编号关联把左表LOC权限表中在当前在右表LOC定义表,把有的LOC都显示出来。若只在LEFT表中有记录的数据不会显示出来。
例子:
SELECT DISTINCT (XQ05.LOC),XI30.LOCNAM
FROM HZTDB/XQ05 INNER JOIN HZTDB01/XI30
ON XQ05.LOC =XI30.LOC WHERE CPY='01'
AND SUBSTRING(TRIM(USR),3,2)='AA' AND XQ05.LOC NOT IN('*ALL')
运行结果显示;
Loc. Location
Name
AA Hangzhou
AG Hangzhou FengGS
LEFT OUTER
把LEFT表无论是否记录在RIGHT表中存在都显示,若select中选择显示RIGHT表的字段,在LEFT表有值而RIGHT表中无对应值显示为空(结果若直接插入临时表会报错)
SQL例子:SELECT DISTINCT (XQ05.LOC),XI30.LOCNAM
FROM HZTDB/XQ05 left JOIN HZTDB01/XI30
ON XQ05.LOC =XI30.LOC WHERE CPY='01'
AND SUBSTRING(TRIM(USR),3,2)='AA' AND XQ05.LOC NOT IN('*ALL')
运行结果(注意AY字段只在LEFT表中存在,显示右表Location Name值为空):
Loc. Location
Name
AA Hangzhou
AG Hangzhou FengGS
AY -
RIGHT OUTER
RIGHT表无论是否记录在表LEFT中存在SELECT都显示。
EXCEPTION
只显示LEFT表对于RIGHT表不MATCH匹配的ROW
例如:SELECT DISTINCT (XQ05.LOC),XI30.LOCNAM
FROM HZTDB/XQ05 EXCEPTION JOIN HZTDB01/XI30
ON XQ05.LOC =XI30.LOC WHERE CPY='01'
AND SUBSTRING(TRIM(USR),3,2)='AA' AND XQ05.LOC NOT IN('*ALL')
运行结果(只显示那些在右表LOC定义表中已经被删除但在LEFT表LOC权限表中仍旧残留有记录的记录):
Loc. Location
Name
AY -
CROSS
LEFT表和RIGHT表每条记录都做链接 ,等于是笛卡尔积。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
顶个咯!用STRSQL就可以输入这些命令的....