Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

select imbriqués

3 réponses
Avatar
John S.
Bonjour,

J'ai lu que mySQL ne gérait pas les SEELCT imbriqués. Or c'est le seul moyen
que je connaisse pour faire une requête du genre :

Donne moi tous les items de la table A dont l'identifiant n'existe pas dans
la table B.
du genre :
SELECT A.nom FROM A where A.id NOT IN (SELECT B.id FROM B)

Aussi, sauriez-vous me traduire cette "requête" en une simple requête mySQL.

et si vous êtes en forme, essayez plutot sur celle-là :

SELECT A.nom FROM A where A.id NOT IN (SELECT B.id FROM B, C where B.link =
C.link)

Merci pour l'aide que vous pourre m'apporter !

3 réponses

Avatar
romain
tu veux pas repondre a ma question "indexe dans un requete sql" ?



Euh, c'est quoi ta question ?

Chris



oui comme ca je l'admet c'est pas tres clair.
c'est le post intitule "indexe dans un requete"
--
Accédez à ce forum en un clique sur le web avec http://web2news.com
http://web2news.com/?fr.comp.applications.sgbd
Avatar
John S.
Et bien j'ai essayé de tirer de la bonne graine de tes exemples (j'avoue que
je n'y comprend rien à leur LEFT OUTER INNER Bidule JOIN), je maitrise mieux
les SELECT IN NOT IN =* et *
J'ai donc écrit cette requête :

SELECT cat.nom
FROM CategorieSite cat, TJ_Site_CategorieSite TJ

LEFT JOIN Site site
ON site.idURL = TJ.idURL
AND site.indActif = 1

WHERE cat.idCategorie = TJ.idCategorie
AND IsNULL(site.idURL)

TJ est une table de jointure entre CategorieSite et Site

Elle est supposée me retourner les noms des catégories qui n'ont aucun site
actif (indActif = 1).
Or elle semble en fait ramener les noms des Catégories qui ont Au Moins un
site inactif.
Vois-tu où est l'erreur ?

Merci.



"Christophe Lephay" a écrit dans le message
de news: bddt20$3r2$
"John S." a écrit dans le message de
news:bddpse$p6m$
> J'ai lu que mySQL ne gérait pas les SEELCT imbriqués. Or c'est le seul
moyen
> que je connaisse pour faire une requête du genre :
>
> Donne moi tous les items de la table A dont l'identifiant n'existe pas
dans
> la table B.
> du genre :
> SELECT A.nom FROM A where A.id NOT IN (SELECT B.id FROM B)
>
> Aussi, sauriez-vous me traduire cette "requête" en une simple requête
mySQL.

SELECT A.nom FROM A LEFT JOIN B ON A.Id = B.Id WHERE IsNull(B.Id)


> et si vous êtes en forme, essayez plutot sur celle-là :
>
> SELECT A.nom FROM A where A.id NOT IN (SELECT B.id FROM B, C where


B.link
> > C.link)

SELECT A.nom FROM (A LEFT JOIN B ON A.Id = B.Id) INNER JOIN C ON B.link > C.link
WHERE IsNull(B.ID)

Bon, je m'ennuie... Tu as pas quelquechose d'un peu plus costaud ? ;)

Chris

PS : ces requêtes sont assez idiomatiques...


Avatar
Christophe Lephay
"John S." a écrit dans le message de
news:bdf2m6$33q$
Et bien j'ai essayé de tirer de la bonne graine de tes exemples (j'avoue


que
je n'y comprend rien à leur LEFT OUTER INNER Bidule JOIN), je maitrise


mieux
les SELECT IN NOT IN =* et *


Oui, c'est pas très intuitif. C'est pour celà qu'il est important de dégager
une forme idiomatique (comme ça, une fois que tu as une solution générale à
ce type de problèmes, tu l'appliques sans plus avoir à y reflechir ou à
comprendre en détail comment ça marche).

J'ai donc écrit cette requête :

SELECT cat.nom
FROM CategorieSite cat, TJ_Site_CategorieSite TJ

LEFT JOIN Site site
ON site.idURL = TJ.idURL
AND site.indActif = 1

WHERE cat.idCategorie = TJ.idCategorie
AND IsNULL(site.idURL)

TJ est une table de jointure entre CategorieSite et Site

Elle est supposée me retourner les noms des catégories qui n'ont aucun


site
actif (indActif = 1).
Or elle semble en fait ramener les noms des Catégories qui ont Au Moins un
site inactif.
Vois-tu où est l'erreur ?



Oui avec cet idiome, le seul critère que tu peux mettre c'est pour tester
l'appartenance à un ensemble. Si l'ensemble en question est lui-même un sous
ensemble restreint , alors tu es obligé de faire une requete intermédiaire
avec les clauses where pour le restreindre (tu ne peux donc pas obtenir ce
que tu veux faire en une seule requete).

Il faudrait un truc comme :

intermediaire SELECT TJ.idURL
FROM TJ INNER JOIN site on TJ.idURL = site.idURL
WHERE site.indActif = 1

SELECT cat.nom FROM cat
FROM cat LEFT JOIN intermediaire on cat.idURL = intermediaire.idURL
WHERE ISNULL( intermediaire.idURL )

En fait, c'est (vraisemblablement) de cette manière que l'interpreteur SQL
traduit les NOT IN, et c'est donc probablement parce que MySQL ne permet pas
les select from select qu'il ne permet pas non plus NOT IN...

Chris