Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 05/12/2012, 12h14   #1
Tonii
Nouveau Membre du Club
 
Inscription : novembre 2009
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 103
Points : 25
Points : 25
Par défaut Récupérer le différentiel

Bonjour à tous,

J'ai une table sur une base oracle ou je récupère la liste des serveurs avec un

Code :
SELECT DISTINCT(server_name) FROM tableA
Je récupère donc une liste de 789 serveurs.
J'ai une autre table dans une autre base oracle et je voudrais savoir si j'ai bien tous ces serveurs.
A l'aide de excel j'ai fait un
Code :
SELECT nom_server FROM tableB WHERE nom_server IN (les 789 serveurs)
J'obtiens 751 résultats. J'aimerais savoir comment connaitre le différentiel entre les 789 serveurs et les 750 résultats pour avoir le nom de ces serveurs?

J'ai pas trouvé la solution. Faudrait que pour chaque serveur dans la condition in qui ne ramene pas de résultat, j'ai justement un indicateur...
J'espère m'etre fait comprendre.

Merci à tout le monde
Tonii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2012, 13h04   #2
Rei Ichido
Membre Expert
 
Inscription : août 2009
Messages : 1 012
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 1 012
Points : 1 532
Points : 1 532
Très simplement !
Il s'agit de récupérer tous les serveurs de tableB qui n'existent pas dans tableA, ça s'écrit exactement comme se conçoit :
Code :
1
2
3
4
 
SELECT b.nom_server 
  FROM tableB b
WHERE NOT EXISTS (SELECT 1 FROM tableA a WHERE a.nom_server = b.nom_server)
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2012, 14h13   #3
Tonii
Nouveau Membre du Club
 
Inscription : novembre 2009
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 103
Points : 25
Points : 25
Oui mais ce n'est pas possible, je me suis mal exprimé, mais les deux bases oracles sont sur deux serveurs différents et y a pas de flux entre les deux.
Je peux interroger les deux de mon poste mais faire une jointure ne marchera pas.

Je me demandais si c'était pas possible de créer une table virtuelle à l'aide d'une requete (et non physiquement avec un create table) et de cette table faire le NOT EXIST. Mais j'y suis pas arrivé...
Tonii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2012, 16h28   #4
Rei Ichido
Membre Expert
 
Inscription : août 2009
Messages : 1 012
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 1 012
Points : 1 532
Points : 1 532
Si vous contrôlez bien les valeurs en entrée (et qu'il n'y a pas de NULL), faites un NOT IN :

Code :
1
2
 
SELECT nom_server FROM tableB WHERE nom_server NOT IN (les 789 serveurs)
Il n'y a pas moyen d'avoir un DBLink entre ces deux serveurs ?
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2012, 17h28   #5
Tonii
Nouveau Membre du Club
 
Inscription : novembre 2009
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 103
Points : 25
Points : 25
Malheureusement non y a pas moyen car faut d'abord demander une ouverture de flux entre les deux machines et ca prend 1 mois ici

Merci pour la réponse

Cela dit je suis toujours curieux de savoir comment créer une table temporaire avec des valeurs et faire un select dessus mais sans passer par la vraie creation de table. Avec un select et un with TableTemp as ...
Quelque chose dans le style ca doit surement exister...

Mais c'est bon j'ai ma réponse pour ma première demande, merci!
Tonii est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2012, 17h50   #6
Rei Ichido
Membre Expert
 
Inscription : août 2009
Messages : 1 012
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 1 012
Points : 1 532
Points : 1 532
Sous Oracle, pour émuler avec WITH une table :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
WITH TableTemp AS 
(
SELECT 1 AS id, 'Serv1' AS Nom_Server FROM DUAL 
-- Histoire de faire comme une vraie table, bien sûr il faut mettre ce dont on a besoin
UNION ALL
SELECT 2 AS id, 'Serv2' AS Nom_Server FROM DUAL
UNION ALL
SELECT 3 AS id, 'Serv3' AS Nom_Server FROM DUAL
UNION ALL
SELECT 4 AS id, 'Serv4' AS Nom_Server FROM DUAL
-- etc.
)
SELECT b.nom_server 
  FROM tableB b
WHERE NOT EXISTS (SELECT 1 FROM TableTemp a WHERE a.nom_server = b.nom_server)
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 11h48   #7
Tonii
Nouveau Membre du Club
 
Inscription : novembre 2009
Messages : 103
Détails du profil
Informations forums :
Inscription : novembre 2009
Messages : 103
Points : 25
Points : 25
Hoo Merci Rei Ichido, c'est exactement ce que je cherchais!!

Merci beaucoup!
Tonii est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h00.


 
 
 
 
Partenaires

Hébergement Web