连接

阅读(3109) 标签: 连接, join, by,

功能介绍:

将多个表按照维进行对齐关联,如果没有相同的维对齐,则自动处理为交叉连接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后面的字段顺序最好保持一致,如果顺序不一致,可能产生歧义