Egalité sur clé multi-colonne - SQL/NoSQL - Programmation
Marsh Posté le 25-02-2009 à 13:39:42
Je tente un petit up
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).
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 ?
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 (...) )
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.
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 ? |
Certes, ça sera sans doute pas des plus optimisé,
mais en fait c'était pour donner une
variante coté écriture
Moi la syntaxe ci-dessous me dérangeait pas
=>
Code :
|
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 ?)
Marsh Posté le 25-02-2009 à 14:59:00
ReplyMarsh Posté le 21-03-2009 à 11:09:22
vttman2 a écrit :
|
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!
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 ?!?).