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

INNER JOIN conditionnel

10 réponses
Avatar
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

10 réponses

Avatar
Ph. B.
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.
Avatar
Ph. B.
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)...
Avatar
Etienne
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
Avatar
Etienne
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
Avatar
Ph. B.
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.
Avatar
pif34
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')
Avatar
pif34
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 !?
Avatar
WebShaker
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
Avatar
WebShaker
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.
Avatar
Ph. B.
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.