功能介绍:
将多个表按照维进行对齐关联,如果没有相同的维对齐,则自动处理为交叉连接CROSS JOIN。
DQL的对齐方式使得用户不需要关心表之间的连接关系,可以为每张表独立设定汇总维度,降低问题复杂度规模,更符合自然思维。
缺省使用主键作为汇总维度。
ON不省略时,则必须写全,指定所有基准维,在多表关联时,BY子句中设定的分组字段要按照顺序同维匹配。
语法描述:
SELECT ......
ON ......
FROM T1WHERE...BY...
JOIN/LEFT JOIN/FULL JOINT2 WHERE ... BY......
JOIN/LEFT JOIN/FULL JOIN Tn
举例:
1 |
SELECT 责任地区编码, 姓名 FROM 销售 |
与这个DQL等同的SQL语句是 “销售”表 LEFT JOIN “雇员”表 |
2 |
SELECT 销售.姓名,回款单.COUNT(*) 回款笔数 ON 雇员.雇员ID FROM 回款单 BY 销售ID JOIN 销售 BY 雇员ID |
回款单表的销售ID和销售表的雇员ID是同维字段,多表关联时,ON子句不能省略 |
3 |
SELECT 销售.姓名,回款单.COUNT(*) 回款笔数 ON 雇员.雇员ID FROM 回款单 BY 销售ID JOIN 销售 |
可以省略“销售”表后面的BY,如果省略,系统会自动将“销售”表的主键写在BY后面,也就是按主键汇总连接 |
4 |
SELECT 订单.SUM(订单金额) 订单总额, 回款单.SUM(金额) 回款总额 ON 年月 FROM 订单 BY 签单日期#年月 FULL JOIN 回款单 BY 回款日期#年月 |
按月份统计订单总额与回款总额,两张表使用FULL JOIN连接,按月份对齐,请注意ON的用法,使用ON之后,年月信息会自动选择两张表有值的那一个,不需要再额外判断,当记录数很多时,这是一个很实用的功能。 |
5 |
SELECT 回款单.SUM(金额)回款总额, 订单.SUM(订单金额) 订单总额 ON 年 FROM 回款单 BY 回款日期#年 FULL JOIN 订单 BY fk2.雇佣日期#年 |
可以使用外键属性化和同维表等同化做为BY后面的字段 |
6 |
SELECT 订单.fk2.雇佣日期#年, 订单.SUM(订单金额) 订单总额, 回款单.SUM(金额)回款总额 ON 年 FROM 订单 BY fk2.雇佣日期#年 JOIN 回款单 BY fk2.雇佣日期#年 |
在多表关联的时候,需要写明字段属于哪张表,对于使用了外键指向表或外键同维表字段的情况,格式为,表名.外键名.字段名,如回款单.fk2.雇佣日期#年,或者表名.外键字段.字段名
|
1 |
SELECT 订单.雇员ID, 回款单.回款日期#年月, 订单.SUM(订单金额) 订单总额, 回款单.SUM(金额) 回款总额 ON 年.年月,雇员.雇员ID FROM 订单 BY 签单日期#年月,雇员ID JOIN 回款单 BY 回款日期#年月,fk2.雇员ID |
多字段关联,需要在BY后面写齐字段 |
2 |
SELECT 回款单.回款日期#年, 订单.SUM(订单金额) 订单总额, 回款单.SUM(金额) 回款总额 ON 年.年, 年.年 FROM 订单 BY 签单日期#年,fk2.雇佣日期#年 JOIN 回款单 BY fk2.雇佣日期#年,回款日期#年 |
请注意BY后面的写法,这四个字段都与日期维关联,并且层次结构全部到年月,在这种情况下,系统会自动按顺序进行匹配,生成的关联条件如下: 订单.签单日期#年=回款单.fk2.雇佣日期#年 AND订单.fk2.雇佣日期#年=回款单.回款日期#年 按照我们的期望应该是 订单.签单日期#年=回款单.回款日期#年AND订单.fk2.雇佣日期#年=回款单.fk2.雇佣日期#年 |
3 |
SELECT 回款单.回款日期#年, 订单.SUM(订单金额) 订单总额, 回款单.SUM(金额) 回款总额 ON 年.年, 年.年 FROM 订单 BY fk2.雇佣日期#年,签单日期#年 JOIN 回款单 BY fk2.雇佣日期#年,回款日期#年 |
方法: 调整 BY后面的顺序,使雇佣日期#年都位于BY后面第一位,这样,生成的关联关系就正确了 |
知识点:
1) 多表关联推荐写法 BY后面的字段顺序最好保持一致,如果顺序不一致,可能产生歧义