INNER JOIN conditionnel

Le
Etienne
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Ph. B.
Le #24358041
Etienne a écrit :
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



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.
Le #24358031
Ph. B. a écrit :
Etienne a écrit :
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



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);


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
Le #24358181
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
Le #24358171
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.
Le #24358761
Etienne a écrit :
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


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
Le #24361061
Le 29/03/2012 11:16, Etienne a écrit :
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



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
Le #24361051
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
Le #24361451
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
Le #24361441
Le 30/03/2012 11:12, pif34 a écrit :
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 !?



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.
Le #24361991
pif34 a écrit :
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 !?



Vous avez raison. :-)

--
Philippe.
Publicité
Poster une réponse
Anonyme