Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1707 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle] 2 requetes faisant la meme chose, deux résultats differents

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Oracle] 2 requetes faisant la meme chose, deux résultats differents

n°1617560
Sebastien
Posté le 01-10-2007 à 18:14:50  profilanswer
 

Bonjour,

 

Si y a un bon expert ici :

 

Contexte : recuperer dans une table tous les contrats ne se trouvant pas dans une autre

Code :
  1. select id_prosp_unique from tapvcontrat
  2. minus
  3. select a.id_prosp_unique
  4. from tapvcontrat a
  5. ,taepcontrat c
  6. where a.id_prosp_unique = c.id_prosp_unique
 
Code :
  1. select a.id_prosp_unique
  2. from tapvcontrat a
  3. where a.id_prosp_unique not in (select id_prosp_unique from taepcontrat)
 


La premiere me revoint des résultats, la deuxieme rien du tout.
Les deux sont du varchar2(15)

 

Si quelqu'un voit le truc


Message édité par Sebastien le 01-10-2007 à 18:23:33
mood
Publicité
Posté le 01-10-2007 à 18:14:50  profilanswer
 

n°1617744
MagicBuzz
Posté le 02-10-2007 à 11:12:16  profilanswer
 

chelou
 
ceci dit, moi j'utiliserais plutôt : (plus standard que les deux tiennes, et fonctionnel sur n'importe quel sgbd y compris les plus pourris)

Code :
  1. SELECT a.id_prosp_unique
  2. FROM tapvcontrat a
  3. LEFT OUTER JOIN tapecontrat b ON b.id_prosp_unique = a.id_prosp_unique
  4. WHERE b.id_pros_unique IS NULL

n°1617747
MagicBuzz
Posté le 02-10-2007 à 11:13:44  profilanswer
 

sinon, teste ta seconde avec un not exists plutôt.
j'ai l'impression (et ça conforte mon hostilité) que le "not in" marche quand il veut et comme il veut, sous oracle du moins)
 

Code :
  1. SELECT a.id_post_unique
  2. FROM tapvcontrat a
  3. WHERE NOT EXISTS (SELECT NULL FROM tapecontrat b ON b.id_post_unique = a.id_post_unique)


Message édité par MagicBuzz le 02-10-2007 à 12:01:14
n°1617748
MagicBuzz
Posté le 02-10-2007 à 11:14:25  profilanswer
 

en tout cas, pour moi t'as mis le doigt sur un des nombreux bugs d'Oracle.


Message édité par MagicBuzz le 02-10-2007 à 11:14:42
n°1617763
Sebastien
Posté le 02-10-2007 à 11:32:33  profilanswer
 

Ah oui tiens j'ai oublié de mettre à jour ici.
Effectivement j'ai testé avec un NOT EXISTS et ca marche parfaitement.

 

Et ta jointure externe aussi marche très bien.

 

J'irais bien dire deux mots à Oracle moi :o


Message édité par Sebastien le 02-10-2007 à 11:33:58
n°1617778
MagicBuzz
Posté le 02-10-2007 à 11:59:55  profilanswer
 

On peut faire un voyage groupé si tu veux :lol:

n°1618136
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-10-2007 à 21:34:07  profilanswer
 

gardez moi une place de choix svp [:florentg]

n°1618286
casimimir
Posté le 03-10-2007 à 11:09:49  profilanswer
 

c'est vrai que c'est un gros bébés capricieux mais y a souvent moyen de comprendre le pourquoi du comment du résultat bizarre.
tu peux afficher tes clés qui remontent normalement avec la 1ere requete?

n°1618342
Sebastien
Posté le 03-10-2007 à 12:11:26  profilanswer
 

Je n'ai pas très bien compris ta question, alors je te donne l'EXPLAIN PLAN, c'est peut etre ca que tu veux
 

Citation :


Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
 
SELECT STATEMENT REMOTE Optimizer Mode=CHOOSE  14     20                            
  MINUS                                  
    SORT UNIQUE NOSORT  14   168   3                            
      INDEX FULL SCAN YYYYY.MV_IXPVBTTAPVCONTRAT_INDX2 14   168   1   XXXXX
    SORT UNIQUE NOSORT  23   529   17                            
      NESTED LOOPS  23   529   15                            
        INDEX FULL SCAN YYYYY.MV_IXPVBTTAPVCONTRAT_INDX2 14   168   1   XXXXXXX                        
        INDEX RANGE SCAN YYYYY.INDX_MV_TAEPCONTRAT_IDPUNIQ 2   22   1   XXXXXX


 

Citation :


Operation Object Name Rows Bytes Cost Object Node In/Out PStart PStop
 
SELECT STATEMENT REMOTE Optimizer Mode=CHOOSE  1     1                            
  INDEX FULL SCAN YYYY.MV_IXPVBTTAPVCONTRAT_INDX2 1   12   1   XXXX
    TABLE ACCESS FULL YYYYY.MV_TAEPCONTRAT 5 K 56 K 536   XXXX
 


 
Ouch le cout :p

n°1618348
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-10-2007 à 12:25:07  profilanswer
 

casimimir a écrit :

c'est vrai que c'est un gros bébés capricieux mais y a souvent moyen de comprendre le pourquoi du comment du résultat bizarre.


c'est une grosse merde bloatée et totalement imprévisible ouais

mood
Publicité
Posté le 03-10-2007 à 12:25:07  profilanswer
 

n°1618377
casimimir
Posté le 03-10-2007 à 13:42:53  profilanswer
 

perso je n'ai pas vraiment de soucis avec, tout mon dataware house est en oracle, mais bon ce n'est pas comparable a un vrai système de prod vu que mes users ne font que des select (ca c'est le pied) et que je contrôle les mise a jour etc, mais au niveau traitement j'ai rarement des surprises.
 
je pensais plutot au foirage du in a cause de x centaines de millier de key comme membres, je n'ai pas l'habitude de lire les explain plain en text (toad noob), le 2ème chiffre derriere la ligne ressort le résultat  en Kbytes non? parceque ca fait pas mal de varchar(15) ca, bon c'est pas une excuse pour qu'il foire on est bien d'accord :)
 
 
tiens quand tu disais qu'il ne te renvoyait rien du tout, tu parlais bien d'un "0 row returned"?


Message édité par casimimir le 03-10-2007 à 13:43:40
n°1618409
MagicBuzz
Posté le 03-10-2007 à 14:41:37  profilanswer
 

je pense aussi que c'est le in qui déconne. (c'est même sûr, c'est pas pour rien qu'Oracle déconseille son utilisation)
 
ceci dit, il devrait au contraire retourner plus de lignes que prévu du coup, alors que là il en ramène pas assez [:magicbuzz]


Message édité par MagicBuzz le 03-10-2007 à 14:42:08
n°1618428
Sebastien
Posté le 03-10-2007 à 14:56:27  profilanswer
 

Ouais 0 row, et oui il explose les compteurs le not in
5000 records 536 KBytes mais ca j'ai du mal à dechiffrer pour un plan d'execution ce que ca signifie concretement


Message édité par Sebastien le 03-10-2007 à 14:58:11
n°1618436
MagicBuzz
Posté le 03-10-2007 à 15:05:42  profilanswer
 

Ca signifie concrètement qu'autant pour certaines fonctionalités, Oracle est extrêment bon, autant pour d'autres, elles ont été développées en QBasic par des stagiaires qui se sont tirés sans écrire de doc, et que plus personne s'ose mettre la main dedans pour corriger les bugs.
 
En gros, Oracle est un des moteurs de base de données les plus puissants, mais avec des limitations qui dépassent celles d'Access 2.0 (je suis pas sûr que j'exagère tant que ça...)

n°1618502
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-10-2007 à 16:13:10  profilanswer
 

une grosse merde quoi... tiens, un truc qui m'arrive régulièrement :
 

Code :
  1. SQL> connect kikoo/mdp@instance as sysdba
  2. SQL> insert into table values (...)
  3. SQL> ORA-01031: insufficient privileges


lolilol non ? et je fais quoi pour résoudre ça ? je reboote le serveur et hop, tout remarche ! même David Copperfield il arrive pas à le faire ça !
en résumé : Copperfield arrive peut être à faire disparaitre un éléphant, mais Oracle arrive à éjecter son sysdba, c'est top [:bien]

n°1618510
casimimir
Posté le 03-10-2007 à 16:17:19  profilanswer
 

ca se tient comme résonnement, quand je vois je ne l'utilise carrément jamais des que je dépasse +/- 10 membres, j'irai max jusqu'a 100 mais je me ferai mal je crois.
 
c'est pas comme ca sur tous les sgbd? :)

n°1618524
Sebastien
Posté le 03-10-2007 à 16:24:40  profilanswer
 

Pas compris ta remarque Casimimir

n°1618528
casimimir
Posté le 03-10-2007 à 16:29:28  profilanswer
 

en gros je fais jamais de in sauf si je définis les valeurs litéralement, style in (1,2,3,4), mais très et de plus en plus rarement un sous select dedans, ou alors de nouveau un sous select qui ne va me ramener que très peu de membre et que j'en suis sur


Message édité par casimimir le 03-10-2007 à 16:30:17
n°1618580
MagicBuzz
Posté le 03-10-2007 à 17:22:57  profilanswer
 

D'autant qu'un IN est quasi toujours remplaçable par un EXISTS, qui fonctionne beaucoup mieux sous Oracle (pas de limitation du nombre de sous éléments)
 
Ceci dit, quand on a une solution plus propre sous la main, autant l'utiliser.


Message édité par MagicBuzz le 03-10-2007 à 17:23:24

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [Oracle] 2 requetes faisant la meme chose, deux résultats differents

 

Sujets relatifs
probleme d installation oracleUtilisation de deux versions de drivers différents (8i & 9i)
comparaison de schéma oracle...[ORACLE] Se connecter à une base
Requêtes SQL: fusion de lignesoracle + convertir chiffres en lettres
Objets FORMS 2.0 différents en VBA et HTML ?[ORACLE 7] Calculer le temps entre 2 dates
Importer dans Access 2007 un MCD de PowerAMC en fichier requêtes SQLRequetes MATCH qui ne fonctionne pas, probleme d'index
Plus de sujets relatifs à : [Oracle] 2 requetes faisant la meme chose, deux résultats differents


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR