Egalité sur clé multi-colonne

Egalité sur clé multi-colonne - SQL/NoSQL - Programmation

Marsh Posté le 25-02-2009 à 00:25:04    

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 ?!?).

Reply

Marsh Posté le 25-02-2009 à 00:25:04   

Reply

Marsh Posté le 25-02-2009 à 13:39:42    

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).

Reply

Marsh Posté le 25-02-2009 à 13:57:27    

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 ...
Reply

Marsh Posté le 25-02-2009 à 14:02:10    

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
Reply

Marsh Posté le 25-02-2009 à 14:09:13    

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.  ;)

Reply

Marsh Posté le 25-02-2009 à 14:19:26    

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 ...
Reply

Marsh Posté le 25-02-2009 à 14:55:37    

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

Reply

Marsh Posté le 25-02-2009 à 14:59:00    

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

 

Démonstration :)


Message édité par MagicBuzz le 25-02-2009 à 15:00:21
Reply

Marsh Posté le 21-03-2009 à 11:09:22    

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!
 
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed