IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Nombre maximal de valeurs passées dans l'instruction IN / NOT IN


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    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.

  2. #2
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 263
    Points
    263
    Par défaut
    1000 il me semble.

    Au delà il faut decouper :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    WHERE .... IN 
    (
    ...,
    ...
    ) OR .... IN 
    (
    ....
    )
    Cordialement.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Cela devrait être une caractéristique propre à chaque SGBD, non ?
    Merci d'ajouter un sur les tags qui vous ont aidé

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    Merci pour vos réponses !

    En faite voici ma requetes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    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.
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    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

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Parmi les syntaxes possibles, la plus simple.

    au lieu de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    AND CHAMP IN (...)
    ...
    tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2007
    Messages : 197
    Points : 47
    Points
    47
    Par défaut
    Ok super je test ça tout de suite
    Merci

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 758
    Points : 52 537
    Points
    52 537
    Billets dans le blog
    5
    Par défaut
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    ok avec stringBuilder sur l'utilisation d'une table temporaire

    avec cette syntaxe plutôt que EXISTS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Merci d'ajouter un sur les tags qui vous ont aidé

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  12. #12
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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"
    On ne jouit bien que de ce qu’on partage.

  13. #13
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...

  14. #14
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    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
    Merci d'ajouter un sur les tags qui vous ont aidé

  15. #15
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    avec cette syntaxe plutôt que EXISTS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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]

    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)

  16. #16
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    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.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/05/2007, 12h06
  2. Récupérer les valeurs passées dans l'URL
    Par bogsy15 dans le forum Langage
    Réponses: 40
    Dernier message: 14/08/2006, 08h24
  3. Nombre maximal de fichiers dans un répertoire
    Par cquilgars dans le forum Administration système
    Réponses: 10
    Dernier message: 15/12/2005, 12h04
  4. Compter nombre d'éléments avec valeur X dans un formulaire
    Par p0Kep0K dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/11/2005, 15h49
  5. Nombre de valeurs différentes dans une colonne
    Par KrusK dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/08/2005, 14h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo