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

SQL Oracle Discussion :

Problème avec la commande MAX()


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 6
    Par défaut Problème avec la commande MAX()
    Bonjour a tous, j'aurais une petite question technique sur la commande MAX().

    Voici l'exemple :

    En base de donnée j'ai les informations suivant.
    (CLE, LIBELLE)
    1, 'Test1'
    2, 'Test2'
    3, 'Test3'
    4, 'Test4'
    100, 'Test100'

    La question est la suivant :
    Est-t-il possible avec la commande MAX (ou une autre) de récupérer la prochaine CLE libre sans prendre en compte l’existence de la valeur 100 ?
    Et si possible sans avoir a faire une boucle qui teste l'existence de la clé.

    J'aimerais donc récupérer 5.

    Merci d'avance pour l'aide qu'on pourrais m'apporter.

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Vous pouvez neutraliser le 100 avec un DECODE par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with t as
    (select 1 as cle, 'Test1' as libelle from dual
    union
    select 2, 'Test2' from dual
    union
    select 3, 'Test3' from dual
    union
    select 4, 'Test4' from dual
    union
    select 100, 'Test100' from dual)
    select max(decode(cle, 100, null, cle)) + 1
    from t;

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 135
    Par défaut
    Ou tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH t AS
    (SELECT 1 AS cle, 'Test1' AS libelle FROM dual
    union
    SELECT 2, 'Test2' FROM dual
    union
    SELECT 3, 'Test3' FROM dual
    union
    SELECT 4, 'Test4' FROM dual
    union
    SELECT 100, 'Test100' FROM dual)
    SELECT max(cle) + 1
    FROM t
    WHERE cle <> 100
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Membre actif
    Inscrit en
    Octobre 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 17
    Par défaut
    En ma connaissance, non aves du simple sql . A moins que j'aie mal compris ta préoccupation (Tu veux récupérer Les Perdues).

    Mais tu peux cela au niveau PL sql si tu utilise oracle ou transacSql si tu utilise sqlServer en écrivant une petite fonction te permettant de récupérer ces clès perdues .

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Ou tout simplement...
    Eh oui, naturellement !

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    En Sql ou en Pl/SQL c’est le même problème. Si vous est le seul à mettre à jour la table c’est OK sinon vous devez prendre en compte que avec Oracle « readers do not block writers » c’est à dire pendant que vous lisez la table pour trouver la valeur maximale quelqu’un d’autre peut la mettre à jour.

  7. #7
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Ou dans un autre ordre d'idée (selon les contraintes d'unicités)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT	MIN(Num)+1 AS Num
    FROM	test_fl N
    WHERE	NOT EXISTS
    	(SELECT	1
    	FROM	test_fl
    	WHERE	Num = N.Num+1);
     
           NUM
    ----------
             5

  8. #8
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par Scriuiw Voir le message
    Ou dans un autre ordre d'idée ...
    Ca serait bien que celui qui a mis un point négatif justifie son reproche.

    Car cette proposition répond sans doute mieux à l'intention du demandeur, qui nous a fourni un jeu de données ambigu. En clair, peut-il y avoir plusieurs trous ou non ?

  9. #9
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Ca serait bien que celui qui a mis un point négatif justifie son reproche.

    ...
    C’est moi grand inquisiteur et ce que je reproche est expliqué dans mon intervention. Mais je n’ai empêché personne de voter pour

  10. #10
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 6
    Par défaut
    Re-bonjour,
    Tout d'abord, merci a tous d'avoir répondu aussi vite.

    Je m'excuse aussi de ne pas avoir été assez précis dans mon exemple, je voulais rester simple pour ne pas embrouiller l'esprit des gens.

    La première réponse, de Pomalaix, a été suffisant pour corrigé mon problème, en utilisant la fonction DECODE, a ceci prés qu'il m'a fallut remplacer la valeur NULL par 0. Ainsi, la valeur 100 est convertie en 0 et se retrouve en début de liste, se qui me permet de correctement récupéré le MAX de la CLE a savoir 5 et cela, même si il y a des trous dans les valeurs.

    Encore merci a tous.

  11. #11
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Omega15 Voir le message
    Re-bonjour,
    ..La première réponse, de Pomalaix, a été suffisant pour corrigé mon problème...
    Je ne suis pas sûr si vous avez bien compris que cette solution, comme les autres par ailleurs, ne fonctionne que dans un traitement batch de nuit ou que si votre application est mono-utilisateur.

  12. #12
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 6
    Par défaut
    Oui oui je comprends, mais ça ne pose pas de problème de notre coté.

    Merci quand même de l'avertissement.

  13. #13
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Citation Envoyé par Pomalaix
    Ca serait bien que celui qui a mis un point négatif justifie son reproche.
    Citation Envoyé par mnitu
    C’est moi grand inquisiteur et ce que je reproche est expliqué dans mon intervention
    Citation Envoyé par Omega15
    Oui oui je comprends, mais ça ne pose pas de problème de notre coté.

  14. #14
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Je ne suis pas sûr si vous avez bien compris que cette solution, comme les autres par ailleurs, ne fonctionne que dans un traitement batch de nuit ou que si votre application est mono-utilisateur.
    Ou a faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    LOCK TABLE .... EXCLUSIVE;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec la commande sed
    Par JUSTIN Loïc dans le forum Linux
    Réponses: 2
    Dernier message: 05/09/2006, 10h17
  2. Problème avec la commande nice
    Par ShadoX dans le forum Administration système
    Réponses: 2
    Dernier message: 08/08/2006, 18h59
  3. Problème avec la commande revoke sous oracle
    Par merlubreizh dans le forum Oracle
    Réponses: 19
    Dernier message: 28/04/2006, 15h02
  4. [C++] Problème avec la commande "make"
    Par quantik-revolution dans le forum Systèmes de compilation
    Réponses: 6
    Dernier message: 02/04/2006, 18h17
  5. problème avec un select max
    Par bobic dans le forum Oracle
    Réponses: 7
    Dernier message: 14/11/2005, 11h22

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