question simple sur requête - SQL/NoSQL - Programmation
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.
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
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.
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....
Marsh Posté le 23-04-2014 à 16:49:01
De quelle norme parles-tu gpl73 ? Des jointures avec les "+" ?
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?
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 :
SELECT * FROM A ,B
WHERE
A.ID = B.ID
AND A.CLASS='B'
correspond à ceci :
SELECT * FROM
A
INNER JOIN
B
ON
A.ID = B.ID
WHERE A.CLASS='B'
ou ceci :
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 :
SELECT * FROM A ,B
WHERE
A.ID = B.ID(+)
AND B.ID(+) IS NULL
correspond à ceci :
SELECT * FROM
A
LEFT OUTER JOIN
B
ON
A.ID = B.ID
WHERE B.ID IS NULL
ou ceci :
SELECT * FROM
A
LEFT OUTER JOIN
B
ON
A.ID = B.ID
AND B.ID IS NULL
Merci à tous