我有以下表结构
注意:所有表引擎都是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 JOIN
和HAVING
子句:
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
请告诉我这两个查询在结果中的区别以及我必须使用哪个或我必须使用不同的查询?
提前致谢
答案 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
并且希望当这样反转时很明显除非区表中有一行,否则不能存在任何结果行。