标签:
在编写SQL脚本中,多表连接查询操作需要使用到on和where条件,但是经常会混淆两者的用法,从而造成取数错误。为此,使用测试数据进行总结如下:
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 ;
最终的记录数等于主表的记录数。
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 WHERE A1.Brand_Id=‘501B03‘ 13 ;
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 WHERE A1.Brand_Id=‘501B03‘ 13 AND A2.Type_Id=10 14 ;
进一步说明,where条件是对连接产生的查询结果集的二次筛选。
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 AND A1.Brand_Id=‘501B03‘ 13 ;
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 AND A2.Type_Id=10 13 ;
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 AND A1.Brand_Id=‘501B03‘ 13 AND A2.Type_Id=10 14 ;
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 ;
这样可以看到,最后查询结果集的记录数不再是14条记录,而是15条,这说明了一点,最后的结果集中的记录数并不是和主表中记录数一致的,而是由主表和被连接表根据连接条件共同确定的,还可以说明的一点是,不论on条件是什么样,多简单多复杂,只要没有where条件,最后的查询结果集中的记录数不会少于主表记录数。对于这个例子,主表中的14条记录都会进入结果表,由于主表中的连接条件只有User_Id相等,因此,对于A2表中的User_Id=989832由于存在两条记录,因此都会与A1表User_Id=989832的那一条记录相连,因此产生了两条连接结果记录,所以使得最后的结果集增至15条记录。
1 SELECT A1.User_Id 2 ,A1.Month_Id 3 ,A1.Brand_Id 4 ,A1.Rate 5 ,A2.User_Id 6 ,A2.Month_Id 7 ,A2.Type_Id 8 FROM table_a A1 9 LEFT JOIN table_b A2 10 ON A1.User_Id=A2.User_Id 11 AND A1.Month_Id=A2.Month_Id 12 ;
上面给A1和A2表的连接条件增加了一个Month_Id相等的条件,这样只有满足这一条件的A2表记录才会参与连接,这样就对A2表中的User_Id=989832剔除了一条记录,所以最后连接只产生了14条记录。
标签:
原文地址:http://www.cnblogs.com/hbsygfz/p/4527003.html