select a.MenuID,a.MenuStructureID,b.MenuName from 
MenuStructure a, Menu b
where b.MenuID=a.MenuID

select a.MenuID,a.MenuStructureID,b.MenuName from 
MenuStructure a
join Menu b  
on b.MenuID=a.MenuID

Si les deux sont identiques, lequel dois-je préférer et pourquoi?

1
Sumit raj 23 mai 2018 à 09:38

3 réponses

Meilleure réponse

Pour les requêtes très simples, il est difficile de justifier l'utilisation de JOIN au lieu de ,. Comme vous l'avez vu, les deux sont très similaires. Ce qui est encore plus évident s'il est présenté légèrement différemment ...

SELECT
  a.MenuID, a.MenuStructureID, b.MenuName
FROM
  MenuStructure a
,
  Menu b  
    WHERE b.MenuID = a.MenuID

SELECT
  a.MenuID, a.MenuStructureID, b.MenuName
FROM
  MenuStructure a
INNER JOIN
  Menu b  
    ON b.MenuID = a.MenuID

Il semble comme s'il s'agissait simplement de remplacer , par JOIN et de remplacer WHERE par ON ...

Cependant, dès que vous écrivez des requêtes plus compliquées, cela devient plus facile à lire avec la notation JOIN, et il devient plus difficile de faire des erreurs en premier lieu ...


Prédicats manquants

Par exemple, les deux sont faux de la même manière, mais seule la notation JOIN donnera une erreur de syntaxe (et sera plus facile à repérer visuellement en premier lieu) .

SELECT
  a.MenuID, a.MenuStructureID, b.MenuName
FROM
  MenuStructure a
,
  Menu b  
,
  Items i  
    WHERE b.MenuID = a.MenuID

SELECT
  a.MenuID, a.MenuStructureID, b.MenuName
FROM
  MenuStructure a
INNER JOIN
  Menu b  
    ON b.MenuID = a.MenuID
INNER JOIN
  Items i

La première requête fonctionne correctement, elle est équivalente à CROSS JOIN Items i, qui peut être coûteuse à exécuter et pénible à déboguer.

La deuxième requête, cependant, a une erreur de syntaxe près de JOIN Items i en raison du manque de prédicat ON i.MenuID = b.MenuID (ou similaire) .

De telles erreurs de syntaxe sont très utiles pour détecter les fautes de frappe et autres erreurs stupides tôt .


JOINTS EXTERNES

Cela devient également plus clair lors de l'utilisation de OUTER JOIN par rapport à l'utilisation de (+)

SELECT
  a.MenuID, a.MenuStructureID, b.MenuName
FROM
  MenuStructure a
LEFT OUTER JOIN
  Menu b  
    ON b.MenuID = a.MenuID

C'est comparé à l'ancienne notation ...

SELECT
  a.MenuID, a.MenuStructureID, b.MenuName
FROM
  MenuStructure a, Menu b
WHERE
  b.MenuID=a.MenuID(+)

Non seulement OUTER JOIN est plus facile à lire, mais si vous saisissez ce qui suit par erreur, vous obtiendrez des résultats différents! (Les fautes de frappe subtiles sont à nouveau légales mais avec des conséquences difficiles à repérer.)

SELECT
  a.MenuID, a.MenuStructureID, b.MenuName
FROM
  MenuStructure a, Menu b
WHERE
  a.MenuID=b.MenuID(+)


Il existe même des expressions qui peuvent être écrites avec OUTER JOIN que ne peuvent pas être écrites avec , et (+). (Je vous laisse faire vos recherches.)

Pour cette raison, presque toutes les grandes distributions recommandent de ne pas utiliser (+) ...

  • si vous n'utilisez pas (+), vous devez utiliser OUTER JOIN.
  • si vous comptez utiliser OUTER JOIN, vous n'utilisez pas ,
  • et vraiment VRAIMENT ne pas mélanger , avec OUTER JOIN ...


L'un des principaux "coupables" de la propagation à l'aide de , est Oracle. Ses tutoriels et fichiers d'aide sont remplis de ,. Mais même Oracle recommande de ne pas utiliser (+)!


Conclusion

Dans l'ensemble, la syntaxe JOIN est plus facile à lire et plus susceptible de donner des erreurs de syntaxe où , peut provoquer des échecs silencieux.

Lors de l'introduction de OUTER JOIN, cela devient complexe, et conduit même à des situations que , et (+) ne peuvent pas gérer.


Sans oublier que JOIN a été codifié en 1992. Pourquoi utiliseriez-vous un standard encore plus ancien que ça !?

2
MatBailie 23 mai 2018 à 07:14

En général, la jointure explicite (version inférieure) est plus facile à lire / déboguer. Donc, si d'autres ont besoin d'utiliser le même code ou si vous devez le réviser après une longue période, c'est préférable.

2
marc_s 11 avril 2019 à 18:43

Si vous souhaitez JOINDRE deux tables, vous pouvez le faire de deux manières. Un utilisant INNER JOIN conforme à ANSI et un autre avec une jointure de style ancien

Mais il est conseillé de ne pas utiliser de jointure de style ancien. Voici la raison.

Créons les ensembles de données suivants

CREATE TABLE item_master(item_id INT, item_description VARCHAR(100));
CREATE TABLE item_sales(item_id INT, sales_date DATETIME, qty INT);
INSERT INTO item_master
SELECT 1,'Samsung' UNION ALL
SELECT 2,'LG'; 
INSERT INTO item_sales
SELECT 1,'2015-04-03 12:10:10',2 UNION ALL
SELECT 2,'2015-06-11 07:22:00',3 UNION ALL
SELECT 2,'2015-06-12 11:00:48',22; 

Si vous souhaitez afficher la description de chaque article avec la quantité totale vendue, vous pouvez utiliser ce code

Méthode 1: INNER JOIN

SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
INNER JOIN item_sales AS details
ON item.item_id=details.item_id
GROUP BY item.item_description;

Méthode 2: jointure de style ancien avec clause WHERE

SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
,item_sales AS details
WHERE item.item_id=details.item_id
GROUP BY item.item_description;

Both renvoie le résultat suivant

item_description qty
 ------------------- ----------
 LG 25
 Samsung 2

Mais que se passe-t-il si vous omettez la condition WHERE dans la méthode 2 par erreur

SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
,item_sales AS details
GROUP BY item.item_description;

Le résultat est

item_description qty
 ------------------- ----------
 LG 27
 Samsung 27

Ce qui est totalement faux car cela conduit à une jointure croisée

Mais la méthode 1 lèvera une erreur si aucun JOIN n'est spécifié

SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
INNER JOIN item_sales AS details
GROUP BY item.item_description;

L'erreur est

Incorrect syntax near the keyword 'group'.

Référence: SQL SERVER - Pourquoi ne pas utiliser l'ancien style JOIN?

1
Mahesh.K 23 mai 2018 à 06:58