Question sur NATURAL JOIN

Question sur NATURAL JOIN - SQL/NoSQL - Programmation

Marsh Posté le 23-01-2005 à 12:42:27    

Voila, en fait j'aimerais savoir la difference entre NATURAL JOIN et LEFT OUTER JOIN, et aussi un autre truc: là j'ai trouvé un cas ou on ne peut pas fremplacer une requete à base de sous-interrogation par une requete utilisant la jointure, est-ce qu'il y a des cas ou on ne peut pas remplacer une requete avec jointure par une requete à base de sous-interrogations ?

Reply

Marsh Posté le 23-01-2005 à 12:42:27   

Reply

Marsh Posté le 23-01-2005 à 13:10:58    

Chronoklazm a écrit :

Voila, en fait j'aimerais savoir la difference entre NATURAL JOIN et LEFT OUTER JOIN


NATURAL JOIN te permet d'omettre la condition de jointure (ON table1.id = table2.id...) si les 2 tables jointes possèdent un champ dont le nom est le même sur chacune d'entre elles. LEFT OUTER JOIN t'oblige à spécifier cette condition
 

Chronoklazm a écrit :


et aussi un autre truc: là j'ai trouvé un cas ou on ne peut pas fremplacer une requete à base de sous-interrogation par une requete utilisant la jointure, est-ce qu'il y a des cas ou on ne peut pas remplacer une requete avec jointure par une requete à base de sous-interrogations ?


la question est plutot : quelle genre de requete ne permet uniquement d'utiliser que la sous requete au lieu de la jointure


Message édité par Harkonnen le 23-01-2005 à 13:35:08

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 23-01-2005 à 14:07:31    

OK merci pour JOIN :)
 
Non, en fait c'était l'inverse: ma question était simplement dans quel cas on ne peut pas remplacer une jointure par une sous requete.
 
Sinon pour la sous-requete qu'on ne peut remplacer par une jointure j'ai un exemple :
 
Un truc tout bete ... On a un tableau d'employé (clé prim : matricule) et un tableau de departement (clé prim num_dept).
 
Si on veut les noms et lieux des départements dans lesquels il n'y a pas d'ingénieur. On peut le faire uniquement avec une sous interrogation:

Code :
  1. select nomd, lieu from dept
  2. where dept not in
  3.   (select dept from emp
  4.    where poste = 'INGENIEUR');


 
C'est pas faisable avec une jointure ...
 
Sinon j'ai l'impression que des qu'il y a une jointure possible on peut la remplacer par une sous-interro (enfin un truc avec des SELECT dans les WHERE à gogo...)


Message édité par Chronoklazm le 23-01-2005 à 14:08:25

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 23-01-2005 à 15:10:08    

Chronoklazm a écrit :

OK merci pour JOIN :)
 
Non, en fait c'était l'inverse: ma question était simplement dans quel cas on ne peut pas remplacer une jointure par une sous requete.
 
Sinon pour la sous-requete qu'on ne peut remplacer par une jointure j'ai un exemple :
 
Un truc tout bete ... On a un tableau d'employé (clé prim : matricule) et un tableau de departement (clé prim num_dept).
 
Si on veut les noms et lieux des départements dans lesquels il n'y a pas d'ingénieur. On peut le faire uniquement avec une sous interrogation:

Code :
  1. select nomd, lieu from dept
  2. where dept not in
  3.   (select dept from emp
  4.    where poste = 'INGENIEUR');


 
C'est pas faisable avec une jointure ...
 


 
Euh bien sur que si...
 

Code :
  1. select nomd, lieu from dept
  2. inner join emp on emp.dept = dept.dept
  3. where emp.poste <> 'INGENIEUR'


 
 

Reply

Marsh Posté le 23-01-2005 à 15:20:49    

Pourtant ca me donne pas la meme chose :(


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 23-01-2005 à 15:40:12    

ah oui j'ai pas lu ton post en entier, j'ai fait que lire la requete. En remplacant le "inner join" par un "left outer join" ca va renovyer en plus les departements n'ayant pas d'employé (donc pas d'ingénieur). Ca correspondra ptet plus à ce que tu veux :o

Reply

Marsh Posté le 23-01-2005 à 16:01:02    

Code :
  1. select distinct nomd, lieu from dept
  2. left outer join emp on emp.dept = dept.dept
  3. where emp.poste != 'INGENIEUR'


 
Ca me zappe un nom de departement (par rapport a la version de sous-interro) en plus de donner les dept n'ayant pas d'employé ...


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 23-01-2005 à 16:04:19    

Essaye ça :
 

Code :
  1. select distinct nomd, lieu from dept
  2. left join emp on emp.dept = dept.dept
  3. where emp.poste = 'INGENIEUR'
  4. and emp.dept is null;

Reply

Marsh Posté le 23-01-2005 à 16:12:52    

J'ai testé  

Code :
  1. select distinct nomd, lieu from dept 
  2. left join emp on emp.dept = dept.dept 
  3. where emp.poste = 'INGENIEUR'
  4. and emp.dept is not null;


 
Sans le not il me renvoyé rien. Sinon s'est toujours pareil.
 


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed