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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Egalité sur clé multi-colonne

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Egalité sur clé multi-colonne

n°1854873
Olivier51
Posté le 25-02-2009 à 00:25:04  profilanswer
 

Hi, c'est possible en SQL (MySQL) d'écrire simplement une égalité sur une clé multi-colonne ?
 
Illustration :

# ma table 'Client' :
- 'Banque' integer
- 'NumCompte' integer
- 'Nom' varchar
- 'Prenom' varchar
- Primary key ('Banque','NumCompte')


 
Maintenant je voudrais trouver tous les clients qui ne sont pas les paires (2,3);(2,10);(3,78);(9897;78);... sans avoir à écrire l'expression lourde ...

SELECT * FROM 'Client' WHERE (Banque=2 AND NumCompte=3) OR (Banque=2 AND NumCompte=10) OR ...


Enfin la tete de l'espression je m'en fous un peu, je veux surtout la solution la plus rapide. Si la solution de la table temporaire pouvait etre éviter (est-ce la solution la plus rapide ?!?).

mood
Publicité
Posté le 25-02-2009 à 00:25:04  profilanswer
 

n°1854978
Olivier51
Posté le 25-02-2009 à 13:39:42  profilanswer
 

Je tente un petit up  :bounce:  
 
En fait, lorsque je me suis initialement pose la question j'esperais avoir de la chance et trouver une syntaxe du genre (bien que n'ayant jamais rien vu de tel dans la documentation) :

SELECT * FROM 'CLIENT' WHERE ['Banque','NumCompte'] IN ([2,3],[2,10],[3,78],...)


 
La liste des paires etant variable, la precompilation de la requete et la table temporaire ne semble pas etre la meilleure solution en terme de performance (la liste etant tres petite par rapport a le nombre d'entree).

n°1854993
vttman2
Je suis Open ...
Posté le 25-02-2009 à 13:57:27  profilanswer
 

Ou alors un truc comme ça  
=>
select concat (Banque,'+',NumCompte)
from Client  
where concat (Banque,'+',NumCompte)
in ('2+3','2+10' ...)
 
... Tu vois le genre ?


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
n°1854998
fluminis
Posté le 25-02-2009 à 14:02:10  profilanswer
 

vttman2 => ta solution ne me semble pas des plus performante : le concat ne va t'il pas obliger un fullscan de la table ?
A verifier, je ne suis pas expert dans le plan d'execution des requetes sql
 
Edit: perso, j'aime pas les clef multiples, j'evite quand je peux : ajout d'une colonne primaire de type int avec auto_increment.
 
Dans ton cas, tu peux faire des simplifications : WHERE (Banque = 'truc' AND NumCompte IN (...) ) OR (Banque = 'truc2' AND NumCompte IN (...) )

Message cité 2 fois
Message édité par fluminis le 25-02-2009 à 14:05:45

---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1855011
Olivier51
Posté le 25-02-2009 à 14:09:13  profilanswer
 

fluminis a écrit :

Dans ton cas, tu peux faire des simplifications : WHERE (Banque = 'truc' AND NumCompte IN (...) ) OR (Banque = 'truc2' AND NumCompte IN (...) )


Ouais, c'est ce que je pensais faire au final si pas d'autres solutions.  ;)

n°1855027
vttman2
Je suis Open ...
Posté le 25-02-2009 à 14:19:26  profilanswer
 

fluminis a écrit :

vttman2 => ta solution ne me semble pas des plus performante : le concat ne va t'il pas obliger un fullscan de la table ?
A verifier, je ne suis pas expert dans le plan d'execution des requetes sql


 
Certes, ça sera sans doute pas des plus optimisé,  
mais en  fait c'était pour donner une  
variante coté écriture  :whistle:  
 
Moi la syntaxe ci-dessous me dérangeait pas  ;)  
=>

Code :
  1. SELECT * FROM 'Client'
  2. WHERE
  3.      (Banque=2 AND NumCompte=3)
  4. OR (Banque=2 AND NumCompte=10)
  5. OR ...


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
n°1855091
MagicBuzz
Posté le 25-02-2009 à 14:55:37  profilanswer
 

oracle supporte les égalités de tuples.
 
c'est le seul sgbd qui le permette à ma connaissance (postgre aussi peut-être ?)

n°1855092
MagicBuzz
Posté le 25-02-2009 à 14:59:00  profilanswer
 

http://img3.imageshack.us/img3/4760/tuple.th.png

 

Démonstration :)


Message édité par MagicBuzz le 25-02-2009 à 15:00:21
n°1864314
akario
Posté le 21-03-2009 à 11:09:22  profilanswer
 

vttman2 a écrit :


 
Certes, ça sera sans doute pas des plus optimisé,  
mais en  fait c'était pour donner une  
variante coté écriture  :whistle:  
 
Moi la syntaxe ci-dessous me dérangeait pas  ;)  
=>

Code :
  1. SELECT * FROM 'Client'
  2. WHERE
  3.      (Banque=2 AND NumCompte=3)
  4. OR (Banque=2 AND NumCompte=10)
  5. OR ...



 
 
en effet, avec ce concat, tu perds ton index sur ta clé multiple... ca va répondre correctement pdt qq temps, jusqu'au jour où 1 enregistrement de plus te plantera ton appli, car le temps de réponse depassera le timeout de la connexion!
 
 
 


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

  Egalité sur clé multi-colonne

 

Sujets relatifs
changer montants de colonne[Bash/KSH] Ajouter une colonne dans un fichier...
[WriteExcel] Protéger un classeur - 1 colonnemulti-tread vitesse
[MySQL-PHP] Egalité sur 2 strings qui ne fonctionne pas [résolu]du contenu d'un dataset à la colonne prédéfinis du datagridview
Savoir si une base de données est mono ou multi utilisateur ?Dédoublonnage tableau multi avec array_unique() ?
Tableau multi avec plusieurs donneesExtraction d'une colonne dans un fichier texte
Plus de sujets relatifs à : Egalité sur clé multi-colonne


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