Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/12/2011, 04h16   #1
Membre du Club
 
Inscription : novembre 2007
Messages : 132
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 132
Points : 44
Points : 44
Par défaut Remplacer une requête avec union avec une requête utilisant case

Salut,

J'ai une requête avec "union" et je me demande s'il y a un moyen de remplacer cette requête qui utiliserais "case then".
La requête est la suivante:
Code :
1
2
3
4
5
6
7
8
SELECT t1.field1 
FROM table1 t1, matable m
WHERE t1.id_matable = m.id
UNION (
  SELECT t2.field2 
  FROM table2 t2, matable m
  WHERE t2.id_matable = m.id
);
Merci
helpcomm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 09h34   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
1) Commence par apprendre la syntaxe en vigueur depuis 1992 pour les jointures.

2) Les parenthèses autour de la seconde requête sont inutiles, UNION sert de séparateur naturel entre les deux requêtes.

3) Les champs (fields) sont à la campagne ou dans les formulaires, pas dans les tables SQL qui sont composées de lignes et de colonnes.

4) Ta requête fait l'union dans la même colonne de table1.field1 et de table2.field2 alors que CASE signifie que tu vas afficher X au cas où une condition est remplie, éventuellement Y au cas où une autre condition est remplie, éventuellement Z dans tous les autres cas.
Ce n'est pas du tout la même chose que la requête UNION.

Alors explique mieux ton besoin, de préférence avec des noms de tables et de colonnes réels au lieu d'utiliser des abstractions et en fournissant la structure des tables impliquées et un petit jeu de données ainsi que le résultat attendu. Ce sera ainsi plus facile de t'aider.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 09h37   #3
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour,

Pour avoir le même résultat je doute.

Le problème étant que vous allez devoir passer par des left outer join et là deux problèmes se posent :
- 1 ligne de "matable" est référencée à la fois dans "table1" et "table2" vous ne pourrez choisir qu'une seule des deux valeurs
- 1 ligne de "matable" n'est référencée dans aucune des deux autres tables : vous allez devoir selectionner une valeur null.


De plus niveau perf je ne pense pas que ce soit la panacée.


Donc gardez votre UNION qui est fait pour le besoin que vous avez.

edit : Ah CinePhil !
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 14h37   #4
Membre du Club
 
Inscription : novembre 2007
Messages : 132
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 132
Points : 44
Points : 44
Merci beaucoup pour la réponse. Ca confirme que j'avais raison. Mon supérieur au travail m'a demandé de faire un case, moi non plus je ne voyais pas comment pour le besoin actuel.

Merci encore une fois
helpcomm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 16h56   #5
Membre du Club
 
Inscription : novembre 2007
Messages : 132
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 132
Points : 44
Points : 44
je reformule ma question

Je réécris la requête d'une autre manière:

Code :
1
2
3
4
5
6
7
8
SELECT m.id,
           case t1.champ1
               when NULL t2.champ2
               else t1.champ1
           END AS monchamp
FROM matable m
LEFT JOIN table1 t1 ON (t1.id_matable = m.id) 
LEFT JOIN table1 t2 ON (t2.id_matable = m.id)
La condition de when null n'est jamais remplie même si j'ai des enregistrement avec null comme valeur de t1.champ1

Le but étant d'afficher tous les enregistrement de table1 et table 2 qui sont relié à matable.

Des suggestions?
helpcomm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 16h58   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Ton besoin est incompréhensible !

Lis la phrase en bleu de ma signature et applique son principe !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 18h13   #7
Membre du Club
 
Inscription : novembre 2007
Messages : 132
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 132
Points : 44
Points : 44
Merci pour le commentaire. Je poste la solution que j'ai trouvé ca sera peut être utile aux gens qui comprendraient la problématique même si je ne suis pas arrivé à la formuler clairement:

Code :
1
2
3
4
5
6
7
8
9
 
SELECT m.id,
           (case 
               when IS NOT NULL t2.champ2  then t2.champ2
               else t1.champ1
           END) AS monchamp
FROM matable m
LEFT JOIN table1 t1 ON (t1.id_matable = m.id) 
LEFT JOIN table1 t2 ON (t2.id_matable = m.id)
helpcomm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 19h16   #8
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Au passage, vous avez acheté un stocke de parenthèses ? Parce que dans cette nouvelles requêtes elle ne servent toujours à rien...

Et c'est pas avec ça que vous allez comprendre ce que vous faites et quelle est la syntaxe du langage SQL....

peut être auriez vous du suivre les cours !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2011, 07h14   #9
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 531
Points : 3 524
Points : 3 524
Citation:
Envoyé par helpcomm Voir le message
Code :
1
2
3
4
5
6
7
8
9
 
SELECT m.id,
           case 
               when IS NOT NULL t2.champ2  then t2.champ2
               else t1.champ1
           END AS monchamp
FROM matable m
LEFT JOIN table1 t1 ON (t1.id_matable = m.id) 
LEFT JOIN table1 t2 ON (t2.id_matable = m.id)
Il convient de préciser que si, pour une ligne, t2.champ2 ET t1.champ1 sont tous les deux NULL, dans cette ligne la colonne monchamp retournera NULL.
C'est peut-être le but recherché, mais il vrai qu'il a été, depuis le début de ce post, si mal formulé que, a minima, le doute est permis.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 17h11   #10
Membre du Club
 
Inscription : novembre 2007
Messages : 132
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 132
Points : 44
Points : 44
Effectivement c'est le but recherché. Et en effet, ca a été mal formulé.

Merci pour votre compréhension et indulgence.
helpcomm est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h40.


 
 
 
 
Partenaires

Hébergement Web