使用4个表建议优化查询(RIGHT JOIN v / s INNER JOIN& HAVING)

时间:2010-07-30 05:07:23

标签: sql mysql join

我有以下表结构

  • table_country ==> country_id(PK)|国家|状态
  • table_department ==> department_id(PK)|部门| country_id(FK)
  • table_province ==> province_id(PK)|省| department_id(FK)
  • table_district ==> district_id(PK)|区| province_id(FK)

注意:所有表引擎都是innoDB

一个国家可以有多个部门,一个部门可以有多个省,一个省可以有多个部门。现在我只需搜索那些至少有一个区

的国家

我编写了以下2个SQL查询,在我的例子中,两个查询都返回相同的结果....请描述这些查询之间的区别

使用RIGHT JOIN

SELECT c.country_id as id, c.country as name 
FROM table_country c 
RIGHT JOIN table_department d ON d.country_id=c.country_id 
RIGHT JOIN  table_province p ON p.department_id=d.department_id 
RIGHT JOIN table_district ds ON ds.province_id=p.province_id 
WHERE c.status='Active' GROUP BY (c.country_id)

使用INNER JOINHAVING子句:

SELECT COUNT(ds.district), c.country_id as id, c.country as name 
FROM table_country c 
INNER JOIN table_department d ON d.country_id = c.country_id 
INNER JOIN table_province p ON p.department_id = d.department_id 
INNER JOIN table_district ds ON ds.province_id = p.province_id 
WHERE c.status='Active' 
GROUP BY (c.country_id)  
HAVING  COUNT(ds.district)>0

请告诉我这两个查询在结果中的区别以及我必须使用哪个或我必须使用不同的查询?

提前致谢

1 个答案:

答案 0 :(得分:0)

我建议使用你的2个查询中的第二个(带内连接),但没有HAVING子句,因为它不是必需的,因为内部连接要求最终结果中的任何行必须在分区表中有一行

您的第一个查询,使用更奇特的RIGHT OUTER JOINS系列,最终会产生相同的结果 - 但由于它们是外连接,因此可能效率较低。表示第一个查询的另一种方法是反转表序列,如下所示:

SELECT
      c.country_id AS id
    , c.country AS name
    , COUNT(ds.district)
FROM table_district ds
      INNER JOIN table_province p ON ds.province_id = p.province_id
      INNER JOIN table_department d ON p.department_id = d.department_id
      INNER JOIN table_country c ON d.country_id = c.country_id
WHERE c.status='Active'
GROUP BY
      c.country_id
    , c.country

并且希望当这样反转时很明显除非区表中有一行,否则不能存在任何结果行。