Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
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 07/02/2011, 14h58   #1
Invité de passage
 
Inscription : février 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 2
Points : 1
Points : 1
Par défaut Pas de solution avec INTERSECT ou MINUS

Bonjour à tous,

Voilà mon problème simplifié : j'ai une table contenant une liste de valeurs possibles (TA) et une autre table contenant une restriction de cette liste de valeurs (TB).
Je souhaite créer une vue me permettant de répondre aux 2 cas suivant
1) Dans le cas où TB est vide, je souhaite récupérer toutes des valeurs de TA.
2) Dans le cas où TB n'est pas vide, je ne souhaite récupérer que les valeurs identifiées dans TB par une jointure sur TA.

Code :
1
2
3
4
5
6
7
8
CREATE TABLE TA (code number(10), valeur varchar2(10));
INSERT INTO TA VALUES (1,'A');
INSERT INTO TA VALUES (2,'B');
INSERT INTO TA VALUES (3,'C');
INSERT INTO TA VALUES (4,'D');
INSERT INTO TA VALUES (5,'E');
 
CREATE TABLE TB (code number(10));
MINUS ne retourne aucune ligne si TB n'est pas alimentée avec l'ordre
Code :
1
2
3
4
5
6
SELECT ta.code, ta.valeur
FROM ta
minus
SELECT ta.code, ta.valeur
FROM ta
WHERE ta.code NOT IN (SELECT tb.code FROM tb);
MINUS fonctionne si TB contient un enregistrement.

Fonctionnement identique avec INTERSECT.

Ma solution actuelle est de faire une vue basée sur un select de ta et tb avec un outer join, de faire un count sur le nb de colonne tb.code renseignées. Si ce nombre est positif, je reprends les valeurs avec tb.code non null sinon je reprends toutes les lignes.

Si quelqu'un a une autre solution, je suis preneur.

Merci.
Vavass est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 16h07   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Il y en a comme d'habitude plusieurs solutions, donc voilà une:
Code pseudoSQL :
1
2
3
4
5
6
SELECT *
  FROM TA
 WHERE NOT EXISTS TB
 Union ALL
SELECT TA.*
  FROM TA (semi) JOIN TB
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 17h48   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous pouvez faire comme ça :
Code :
1
2
3
4
5
SELECT ta.code, ta.valeur
  FROM ta
 WHERE NOT EXISTS (SELECT NULL
                     FROM tb
                    WHERE tb.code <> ta.code);
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 00h15   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
ca ne marche pas ça, Waldar.. enfin ça ne marche que si TB est vide ou ne contient qu'une ligne.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
WITH ta AS (SELECT 1 code FROM dual 
UNION ALL SELECT 2 FROM dual
UNION ALL SELECT 3 FROM dual
UNION ALL SELECT 4 FROM dual
UNION ALL SELECT 5 FROM dual
),
tb AS (SELECT 1 code FROM dual 
UNION ALL SELECT 2 FROM dual
)
SELECT *
FROM ta
 WHERE NOT EXISTS (SELECT NULL
                     FROM tb
                    WHERE tb.code <> ta.code)
 
no rows returned
Citation:
1) Dans le cas où TB est vide, je souhaite récupérer toutes des valeurs de TA.
2) Dans le cas où TB n'est pas vide, je ne souhaite récupérer que les valeurs identifiées dans TB
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WITH ta AS (SELECT 1 code FROM dual 
UNION ALL SELECT 2 FROM dual
UNION ALL SELECT 3 FROM dual
UNION ALL SELECT 4 FROM dual
UNION ALL SELECT 5 FROM dual
),
tb AS (SELECT 1 code FROM dual --WHERE 1=2
UNION ALL SELECT 2 FROM dual --WHERE 1=2
)
SELECT *
FROM ta
WHERE EXISTS (SELECT 1 FROM tb WHERE tb.code = ta.code)
OR NOT EXISTS (SELECT 1 FROM tb)
 
CODE
1
2
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 01h57   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Citation:
Envoyé par McM Voir le message
ca ne marche pas ça, Waldar.. enfin ça ne marche que si TB est vide ou ne contient qu'une ligne.
Ah oui tient, je n'avais testé qu'avec 0 ou 1
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 08h29   #6
Invité de passage
 
Inscription : février 2011
Messages : 2
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 2
Points : 1
Points : 1
merci Waldar, McM et mnitu !
J'ai retenu la solution de mnitu.
Bonne journée.
Vavass 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 09h01.


 
 
 
 
Partenaires

Hébergement Web