question simple sur requête

question simple sur requête - SQL/NoSQL - Programmation

Marsh Posté le 17-04-2014 à 21:17:26    

Salut,
 
J'aurai quelque question au sujet de l'écriture de requête SQL nouvelle norme à savoir sans le =.
 
Est-ce que l'équivalent de cette requête :

Citation :

SELECT * FROM A ,B
WHERE
A.ID = B.ID
AND A.CLASS='B'


 
correspond à ceci :

Citation :

SELECT * FROM  
A  
INNER JOIN
B
ON
A.ID = B.ID
WHERE A.CLASS='B'


 
ou ceci :

Citation :

SELECT * FROM  
A  
INNER JOIN
B
ON
A.ID = B.ID
AND A.CLASS='B'


 
et
est-ce que l'équivalent de cette requête :

Citation :

SELECT * FROM A ,B
WHERE
A.ID = B.ID(+)
AND B.ID(+) IS NULL


 
correspond à ceci :

Citation :

SELECT * FROM  
A  
LEFT OUTER JOIN
B
ON
A.ID = B.ID
WHERE B.ID IS NULL


 
ou ceci :

Citation :

SELECT * FROM  
A  
LEFT OUTER JOIN
B
ON
A.ID = B.ID
AND B.ID IS NULL


 
Merci à tous

Reply

Marsh Posté le 17-04-2014 à 21:17:26   

Reply

Marsh Posté le 18-04-2014 à 11:35:05    

Les 3 premières requêtes sont équivalentes.
 
Pour les 3 suivantes, l'opérateur (+), c'est du oracle, je crois. N'en ayant jamais fait, je ne me prononcerais pas.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 22-04-2014 à 23:20:38    

c'est quoi cette nouvelle norme? cela concerne quel environnement?
 
les 2 premières propositions sont équivalentes sauf que dans la première tu fais du sql "propre", on va dire...
en mettant dans la jointure uniquement des clés ou champ de jointure et que dans la close where tu fais la sélection ...
dans le seconde : tu fais un peu tout en même temps, tu écris une jointure en y ajoutant une sélection...
Les  2 jointures te remonteront les mêmes données, mais avec des temps d'exécutions qui vont être différents... surtout si tu as des grosses tables...
 
Pour ce qui est de l'autre requête, pareil... je ne sais pas ce que c'est le (+)
mais les 2 autres left outer join sont "pas compris" en fait
quand tu écris :
select * (pour simplifier) from a left outer join b on a.id = b.id
(tu prends tous les enregistrements qui sont dans la table a et pas forcement dans la table b)
si tu mets: where b.id = null cela veut dire que l'id n'est pas trouver"...
donc plutôt de faire un left outer join, avec une selection  
tu fais un exception join et tu as tout de suite la bonne requête (plus simple à comprendre, non?)
select a.* from a exception join b on a.id = b.id
 
la seconde : letf outer join b on a.id= b.id and b.id is null...
sur AS400 (je ne sais pas si cela réagit vraiement pareil sur les autres plateformes)
remonte tout mais tu n'as aucune valeur des champs de b
 
NB.: J'avais vu ça déjà précement :
 
si tu as dans ta table a
id value
1  '1'
2  '2'
3  '3'  
 
dans la table b
id value
3  '3'
4  '4'
 
tu as un résultat différent si tu fais un
SELECT * FROM    
A                
LEFT OUTER JOIN  
B                
ON                
A.ID = B.ID    
cela remonte tout "normalement" comme un left outer join...
1 '1'  null null
2 '2'  null null
3 '3'   3   '3'
4 '4'   4    '4'
 
mais si tu ajoutes par exemple dans la jointure on, une selection sur un champ de la seconde table...
 
SELECT * FROM    
A                
LEFT OUTER JOIN  
B                
ON                
A.ID = B.ID    
and b.value ='4'  
cela les 3 lignes mais :
1 '1'  null null
2 '2'  null null
3 '3'  null null
4 '4'  4    '4'
 
Et ceci est différent de:
SELECT * FROM    
A                
LEFT OUTER JOIN  
B                
ON                
A.ID = B.ID    
where
b.value ='4'  
(qui correspondant en fait à un inner join)
 
 
 
 
 
Guillaume
 


Message édité par gpl73 le 23-04-2014 à 13:46:47

---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 23-04-2014 à 14:11:48    

gpl73, au sujet des temps d'exécution, ils ne seront pas forcément différents, surtout sur des requêtes aussi simple, l'optimiseur de requêtes du SGBD passant généralement par-là avant l'exécution d'une requête, en la réécrivant de la manière la plus optimale pour lui. ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 23-04-2014 à 16:37:53    

C'est une rumeur cette nouvelle norme? ou cela va se généraliser à l'ensemble des environnements SQL ?
Car il me semble bien que cela ne soit pas si nouveau, comme écriture de jointure, vu que dans ma jeunesse :), j'ai appris à les écrire comme ça mes premiers inner join....


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 23-04-2014 à 16:49:01    

De quelle norme parles-tu gpl73 ? Des jointures avec les "+" ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 24-04-2014 à 08:12:52    

bonjour, je parles de la "nouvelle norme" de donny3:
"J'aurai quelque question au sujet de l'écriture de requête SQL nouvelle norme à savoir sans le =. "
info ou intox?


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Sujets relatifs:

Leave a Replay

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