Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

INNER JOIN conditionnel

5 views
Skip to first unread message

Etienne

unread,
Mar 28, 2012, 10:37:17 AM3/28/12
to
Salut.

j'ai une base de donnée avec des produits.
je voudrai savoir s'il est possible de faire une jointure seulement si
l'un des champs de la table produit vaut une valeur precise.

Genre j'ai des produit Rouge et d'autre Bleu.

Je voudrai faire un
SELECT * FROM produit WHERE couleur = 'Rouge'
UNION
SELECT * FROM produit
INNER JOIN autre_table ON produit.id = autre_table.id WHERE couleur =
'Bleu';

mais sans passer pas une UNION si toutefois c'est possible.

Merci
Etienne

Ph. B.

unread,
Mar 29, 2012, 3:33:51 AM3/29/12
to
Etienne a écrit :
Bonjour,

Non car le 2° select ne renvoie pas la même structure d'ensemble de
données que le 1° du fait de la jointure :
_1° select = colonnes de la table "produit"
_2° select = colonnes des tables "produit" et "autre_table"

Si vous vous limitez aux colonnes de la table "produit", vous pouvez
écrire un truc comme cela :

SELECT * FROM produit
WHERE couleur = 'Rouge'
OR (couleur = 'Bleu'
AND
id IN ( select id from autre_table);
--
Philippe.

Ph. B.

unread,
Mar 29, 2012, 3:37:06 AM3/29/12
to
Ph. B. a écrit :
J'ai également oublié de préciser que les 2 select initiaux n'ont pas
des conditions de filtre similaire (le 1° ne filtre que sur la couleur
et le 2° sur la couleur et l'existence d'un id identique dans une autre
table)...

Etienne

unread,
Mar 29, 2012, 5:14:41 AM3/29/12
to
Le 29/03/2012 09:33, Ph. B. a écrit :
> Bonjour,
>
> Non car le 2° select ne renvoie pas la même structure d'ensemble de
> données que le 1° du fait de la jointure :
> _1° select = colonnes de la table "produit"
> _2° select = colonnes des tables "produit" et "autre_table"
>
> Si vous vous limitez aux colonnes de la table "produit", vous pouvez
> écrire un truc comme cela :
>
> SELECT * FROM produit
> WHERE couleur = 'Rouge'
> OR (couleur = 'Bleu'
> AND
> id IN ( select id from autre_table);

oups.
Non en fait il fallait lire

SELECT produit.* FROM produit WHERE couleur = 'Rouge'
UNION
SELECT produit.* FROM produit
INNER JOIN autre_table ON produit.id = autre_table.id WHERE couleur =
'Bleu';

Etienne

Etienne

unread,
Mar 29, 2012, 5:16:18 AM3/29/12
to
Le 29/03/2012 09:37, Ph. B. a écrit :
> J'ai également oublié de préciser que les 2 select initiaux n'ont pas
> des conditions de filtre similaire (le 1° ne filtre que sur la couleur
> et le 2° sur la couleur et l'existence d'un id identique dans une autre
> table)...

Oui mais c'est exactement ce que je veut faire !!!
prendre tous les produit rouge.
et le produit bleu dont il existe une jointure.

Etienne

Ph. B.

unread,
Mar 29, 2012, 8:14:56 AM3/29/12
to
Etienne a écrit :
Donc ma requête devrait te convenir ?
sauf qu'il manque une parenthèse finale ! oups !:-(

SELECT * FROM produit
WHERE couleur = 'Rouge'
OR (couleur = 'Bleu'
AND
id IN (select id from autre_table));
--
Philippe.

pif34

unread,
Mar 30, 2012, 5:11:02 AM3/30/12
to
ben c'est une jointure ouverte alors, non ?

SELECT * FROM produit p
left outer join autre_table at ON produit.id = autre_table.id
where p.couleur = 'Rouge' or (at.id is not null and p.couleur = 'Bleu')

pif34

unread,
Mar 30, 2012, 5:12:25 AM3/30/12
to
Le 29/03/2012 14:14, Ph. B. a écrit :

> SELECT * FROM produit
> WHERE couleur = 'Rouge'
> OR (couleur = 'Bleu'
> AND
> id IN (select id from autre_table));

dépend de la bd, mais en général sous oracle le exist est plus
perfomant, et pour ce genre de chose j'avais en tete qu'il fallait
préfére la jointure ouverte !?

WebShaker

unread,
Mar 30, 2012, 8:04:39 AM3/30/12
to
Le 30/03/2012 11:11, pif34 a écrit :
> SELECT * FROM produit p
> left outer join autre_table at ON produit.id = autre_table.id
> where p.couleur = 'Rouge' or (at.id is not null and p.couleur = 'Bleu')

Ah ben oui. Ca c'est pas mal !!!
Merci

Etienne

WebShaker

unread,
Mar 30, 2012, 8:06:25 AM3/30/12
to
Ben je vais tester les deux solutions.
La plus rapide sera la mieux !

J'ai quelques doute sur le IN qui ne m'a jamais semblé bien véloce avec
PostgreSQL.

Merci.

Ph. B.

unread,
Mar 30, 2012, 10:12:12 AM3/30/12
to
pif34 a écrit :
Vous avez raison. :-)

--
Philippe.
0 new messages