2010-07-30 8 views
0

Je suit structure de la tableSuggérer requête optimisée à l'aide de 4 tables (RIGHT JOIN INNER v/JOIN & AYANT)

  • table_country ==> country_id (PK) | pays | statut
  • table_department ==> numéro_de_part (PK) | département | country_id (FK)
  • table_province ==> province_id (PK) | province | department_id (FK)
  • table_district ==> ID_district (PK) | quartier | province_id (FK)

REMARQUE: tous les moteurs de tables sont InnoDB

Un pays peut avoir plusieurs département, un département peut avoir plusieurs provinces et une province peut avoir district multiple. Maintenant, je dois rechercher uniquement les pays qui ont au moins un district

J'ai écrit les 2 ci-dessous des requêtes SQL, dans mon cas, les deux requêtes renvoient les mêmes résultats .... s'il vous plaît décrire la différence entre ces requêtes

L'utilisation d'un 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) 

en utilisant INNER JOIN et HAVING clause:

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 

S'il vous plaît dites-moi où ces deux requêtes font la différence dans les résultats et lequel dois-je utiliser ou dois-je utiliser une requête différente?

Merci à l'avance

+0

La deuxième requête semble manquer un 'GROUP BY country_id, country'. L'INNER JOIN rend le 'HAVING' redondant. – pascal

+0

@pascal AFAIK Dans la jointure interne, nous obtiendrons des enregistrements correspondants uniquement lorsque la jointure droite ou gauche vous donne également des enregistrements NULL. – JustLearn

+0

@pascal Quelle est la redondance de l'utilisation de INNER JOIN & HAVING ensemble, suggérons un exemple – JustLearn

Répondre

0

Je suggère d'utiliser la deuxième de vos 2 requêtes (avec jointures internes), mais sans la clause HAVING car il n'est pas nécessaire parce que la jointures exigent que toute ligne dans le résultat final DOIT avoir une rangée dans la table de district. La première de vos requêtes, utilisant une série plus exotique de RIGHT OUTER JOINS, produit finalement le même résultat - mais comme ce sont des jointures externes, il est potentiellement moins efficace. Une autre façon de représenter votre première requête serait d'inverser la séquence de table comme ceci:

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 

et nous espérons que lorsqu'il est renversé comme il est clair qu'aucune ligne de résultat peut exister à moins d'une ligne de la table de district.