功能介绍:
将多个表按照维进行对齐关联,这种对齐方式使得用户不需要关心表之间的连接关系,可以为每张表独立设定汇总维度,降低问题复杂度规模,更符合自然思维。
缺省使用主键作为汇总维度。
ON不省略时,则必须写全,指定所有基准维,在多表关联时,BY子句中设定的分组字段要按照顺序同维匹配。
语法描述:
SELECT ......
ON ......
FROM T1 WHERE...BY...
JOIN/LEFT JOIN/FULL JOINT2 WHERE ... BY......
JOIN/LEFT JOIN/FULL JOIN Tn
或
UNION T2 WHERE ... BY......
举例:

|
1 |
SELECT VIP级别,客户名称 FROM VIP客户 |
与这个DQL等同的SQL语句是 “VIP客户”表 LEFT JOIN “客户”表 |
|
2 |
SELECT VIP客户.VIP级别, 回款单.COUNT(*) 回款笔数 ON 客户.客户 FROM 回款单 BY 客户 JOIN VIP客户 BY VIP客户 |
回款单表的客户和VIP客户表的VIP客户是同维字段,多表关联时,ON子句不能省略 |
|
3 |
SELECT VIP客户.VIP级别, 回款单.COUNT(*) 回款笔数 ON 客户.客户 FROM 回款单 BY 客户 JOIN VIP客户 |
可以省略“VIP客户”表后面的BY,如果省略,系统会自动将“VIP客户”表的主键写在BY后面,也就是按主键汇总连接 |
|
4 |
SELECT 订单.SUM(订单金额) 订单总额, 回款单.SUM(金额) 回款总额 ON 月 FROM 订单 BY 签单日期#月 FULL JOIN 回款单 BY 回款日期#月 |
按月份统计订单总额与回款总额,按月份对齐,请注意ON的用法,使用ON之后,月信息会自动选择两张表有值的那一个,不需要再额外判断,当记录数很多时,这是一个很实用的功能。 |
|
5 |
SELECT 回款单.SUM(金额) 回款总额, 订单.SUM(订单金额) 订单总额 ON 年 FROM 回款单 BY 回款日期#年 UNION 订单 BY fk2.雇佣日期#年 |
可以使用外键属性化和同维表等同化做为BY后面的字段。 UNION 与FULL JOIN 是相同结果。 |
|
6 |
SELECT 订单.fk2.雇佣日期#年, 订单.SUM(订单金额) 订单总额, 回款单.SUM(金额)回款总额 ON 年 FROM 订单 BY fk2.雇佣日期#年 JOIN 回款单 BY fk3.雇佣日期#年 |
在多表关联的时候,需要写明字段属于哪张表,对于使用了外键指向表或外键同维表字段的情况,格式为,表名.外键名.字段名,如回款单.fk3.雇佣日期#年,或者表名.外键字段.字段名
|
|
1 |
SELECT 订单.雇员, 回款单.回款日期#月, 订单.SUM(订单金额) 订单总额, 回款单.SUM(金额) 回款总额 ON 月,雇员 FROM 订单 BY 签单日期#月,雇员 JOIN 回款单 BY 回款日期#月,fk3.雇员 |
多字段关联,需要在BY后面写齐字段 |
|
2 |
SELECT 回款单.回款日期#年, 订单.SUM(订单金额) 订单总额, 回款单.SUM(金额) 回款总额 ON 年,年 FROM 订单 BY 签单日期#年,fk2.雇佣日期#年 JOIN 回款单 BY fk3.雇佣日期#年,回款日期#年 |
请注意BY后面的写法,这四个字段都与日期维关联,如下: 订单.签单日期#年=回款单.fk3.雇佣日期#年 AND订单.fk2.雇佣日期#年=回款单.回款日期#年 按照我们的期望应该是 订单.签单日期#年=回款单.回款日期#年AND订单.fk2.雇佣日期#年=回款单.fk3.雇佣日期#年 |
|
3 |
SELECT 回款单.回款日期#年, 订单.SUM(订单金额) 订单总额, 回款单.SUM(金额) 回款总额 ON 年,年 FROM 订单 BY fk2.雇佣日期#年,签单日期#年 JOIN 回款单 BY fk3.雇佣日期#年,回款日期#年 |
方法: 调整 BY后面的顺序,使雇佣日期#年都位于BY后面第一位,这样,生成的关联关系就正确了 |
知识点:
1) 多表关联推荐写法 BY后面的字段顺序最好保持一致,如果顺序不一致,可能产生歧义