Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/10/2011, 10h55   #1
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Par défaut Nombre maximal de valeurs passées dans l'instruction IN / NOT IN

Bonjour à tous ,

Quelqu'un pourrait-il me dire combien peut-on passer au maximum de valeur dans l'instruction IN / NOT IN ?

Merci d'avance pour votre aide.
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 10h57   #2
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
1000 il me semble.

Au delà il faut decouper :

Code :
1
2
3
4
5
6
7
8
9
 
WHERE .... IN 
(
...,
...
) OR .... IN 
(
....
)
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 11h03   #3
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Cela devrait être une caractéristique propre à chaque SGBD, non ?
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 11h14   #4
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Merci pour vos réponses !

En faite voici ma requetes :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
SELECT  ALL       T02.E7B8ZC,T01.CXAN8X,T01.CXHZZE,T01.CXB9ZC,T03.NUGUFX,T03.NUGVFX,T02.E7BUZA,T04.DYEVZE,T03.NUDWF7,T03.NUG3FX,T03.NUG4FX,T03.NUDXF7,T01.CXB6ZA,T01.CXA3ZB,T01.CXARZF,T01.CXCEZA,T02.E7BUZA                FROM DISACTDTA1.COE7REP T02,                                     DISACTDTA1.COCXREP T01,                                          
SATACTDTA1.FINURED T03,                                          
DISACTDTA1.CODYREP T04,                                          
SATACTDTA1.FAFLRED T05,                                          
DISACTDTA1.COC1REP T06                                            
												WHERE     E7B8ZC = CXB8ZC                                                  
AND     NUB8ZC = CXB8ZC                                                  
AND     DYBUZA = E7BUZA                                                  
AND     NUGVFX = FLAAFJ                                                  
AND     E7CIZA = DYCIZA                    
AND     T01.CXCEZA = T06.C1CEZA  
AND     T01.CXCDZA IN('" . implode("','", $_SESSION['code_groupe']) . "') 
AND     T02.E7B8ZC  IN('" . implode("','", $abonnes) . "') 
AND     T02.E7BUZA IN('" . implode("','", $_POST['CHECK']) . "')
AND     CXA3ZB <> 0                        
AND     CXA6ZB = 0  
GROUP BY E7B8ZC,E7BUZA,CXHZZE,CXB9ZC,NUGUFX,NUGVFX,DYEVZE,CXAN8X,NUDWF7,NUG3FX,NUG4FX,NUDXF7,CXB6ZA,CXA3ZB,CXARZF,CXCEZA,E7BUZA
L'instruction suivante:
Code :
1
2
 
AND     T02.E7B8ZC  IN('" . implode("','", $abonnes) . "')
est un tableau qui peut contenir jusqu’à 80 000 valeurs , combien puis-je faire le découpage ?
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 11h23   #5
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Vu la volumétrie, personnellement, je passerais par une jointure sur une table temporaire : plus de problème de nombre de IN, et certainement de meilleures performances au final.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 11h48   #6
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Merci de ta réponse !!

Peux-tu me faire voir la structure du query avec une table temporaire stp ? parce que je ne visualise pas très bien ce que tu veux dire
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 12h03   #7
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Parmi les syntaxes possibles, la plus simple.

au lieu de faire :

Code :
1
2
3
4
 
...
AND CHAMP IN (...)
...
tu fais :

Code :
1
2
3
4
 
...
AND EXISTS (SELECT NULL FROM TABLE_TEMPORAIRE t WHERE CHAMP = t.champ)
...
Ca devrait être plus performant, surtout si tu utilises plusieurs fois de suite les mêmes listes de valeurs (donc réutilisation de la table temporaire plutôt qu'une liste à n'en plus finir de valeurs dans un IN)
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 12h05   #8
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Ok super je test ça tout de suite
Merci
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 12h21   #9
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Citation:
Envoyé par kamnouz Voir le message
Bonjour à tous ,

Quelqu'un pourrait-il me dire combien peut-on passer au maximum de valeur dans l'instruction IN / NOT IN ?

Merci d'avance pour votre aide.
Il n'y a théoriquement aucune limite d'aucune sorte prévue par le langage (norme).

Cependant et comme on vous l'a indiqué, plus il y en a, moins c'est optimal.

Donc, passez par une table pour stocker préalablement vos éléments.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 12h27   #10
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
ok avec stringBuilder sur l'utilisation d'une table temporaire

avec cette syntaxe plutôt que EXISTS
Code :
1
2
3
 
FROM TABLE
    INNER JOIN Table_Temp (Table_Temp.id = TABLE.Id)
plus efficace que le EXISTS


Et ce serait bien de suivre la norme pour les jointure
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 13h13   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Quelque chose me dit que $_SESSION['code_groupe'] et $abonnes contiennent des données qui ont été extraites de la BDD...
Pourquoi utiliser une table temporaire si les données existent déjà en BDD ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 13h48   #12
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Citation:
Envoyé par dehorter olivier Voir le message
ok avec stringBuilder sur l'utilisation d'une table temporaire

avec cette syntaxe plutôt que EXISTS
Code :
1
2
3
 
FROM TABLE
    INNER JOIN Table_Temp (Table_Temp.id = TABLE.Id)
plus efficace que le EXISTS


Et ce serait bien de suivre la norme pour les jointure
Hmmmm, en effet, au départ, j'avais pensé à la bête jointure (cf. mon premier post) mais pour je ne sais quelle obscure raison, tout d'un coup je me suis dis que c'était pas possible

On va remettre ça sur le fait que je suis jeune papa, et que ça fait 15 jours que je ne sais plus ce que ça veut dire le mot "dormir"
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 14h08   #13
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Citation:
Envoyé par dehorter olivier Voir le message
ok avec stringBuilder sur l'utilisation d'une table temporaire

avec cette syntaxe plutôt que EXISTS
Code :
1
2
3
 
FROM TABLE
    INNER JOIN Table_Temp (Table_Temp.id = TABLE.Id)
plus efficace que le EXISTS
Sur l'efficacité comparative, c'est discutable et ça dépend du SGBD. Cela peut aussi poser des problèmes de dédoublement de lignes si la table temporaire a des lignes en double ...
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2011, 14h18   #14
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Citation:
Envoyé par Rei Ichido Voir le message
Sur l'efficacité comparative, c'est discutable et ça dépend du SGBD. Cela peut aussi poser des problèmes de dédoublement de lignes si la table temporaire a des lignes en double ...

Bien sur, mais l'utilisation d'une table temporaire doit être "conceptualisée" pour répondre aux besoins et tester son efficacité par rapport à une requête plus "classique" dans sa construction
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 09h58   #15
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Citation:
Envoyé par dehorter olivier Voir le message
avec cette syntaxe plutôt que EXISTS
Code :
1
2
3
 
FROM TABLE
    INNER JOIN Table_Temp (Table_Temp.id = TABLE.Id)
plus efficace que le EXISTS
Les deux syntaxes n'ont pas la meme signification. La jointure ne répond pas strictement aux specs decrites...
[/QUOTE]

Citation:
Et ce serait bien de suivre la norme pour les jointure
Je suppose que vous voulez parler des jointures explicites décrites dans la grammaire BNF SQL-92 ? Or cette meme grammaire decrit aussi bien la jointure implicite... La norme n'est donc pas définie dans cette grammaire, mais dans votre propre méthode de conception. Si il est effectivement conseillé de l'utiliser, elle n'est pas LA norme ...

@kamnouz
Dans la requete initiale, ce qui me choque c'est le group by, sans utilisation de fonction d'aggrégation... Je pense que cela est fait pour palier une erreur de clause et gerer la génération de doublons.
L'utilisation de la jointure explicite peut plus facilement vous ammener a trouver la cause de ces doublons...

Comme précaunisé par les intervenants principaux, utilisez une table temporaire, indexez vos colonnes pour optimiser vos performances de recherche, utilisez le EXISTS, et recherchez la cause de la necessité de votre GROUP BY.

Bon Courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 10h12   #16
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Je suppose que vous êtes sous MySQL (question non posée je crois...)?

Vous générez donc votre IN côté client au moment de générer votre requêtes?
Cette génération fait'elle appel à un mécanisme métier ou est-ce une liste issue de l'IHM (multi-sélection dans une grille par exemple)?

Si c'est le premier cas je vous encourage à déporter ce métier dans votre code SQL afin de remplacer le IN par des jointures ou filtres...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h15.


 
 
 
 
Partenaires

Hébergement Web