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

Sybase Discussion :

requetes sql firebird


Sujet :

Sybase

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 18
    Points
    18
    Par défaut requetes sql firebird
    bonjour tout le monde
    j'ai une table qui n'a qu'une seule colonne dont les elements sont:
    5000
    2500
    -5000
    6000
    30000
    -6000
    3200
    -20000
    -10000
    4000

    je voudrais alors faire une requete qui me permetrait d'avoir:
    1-seulement les nombres qui n'ont pas d'opposé. pour ce cas precis on a:
    2500
    3200
    4000
    2-pour le nombre 30000 par exemple, les nombres -20000 et -10000 qui se suivent donne une somme egale à -30000 qui est l'opposé du nombre 30000. Pour ces cas pareille, je veux pas que ma requete m'affiche le nombre 30000.

    je resterai à votre disposition pour plus de precisions

    Cordialement.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Non de la table ?
    Nom de la colonne ?
    Cette table a t-elle une clef ? Laquelle ?
    DDL de la table
    Jeu d'essais sous forme INSERT.

    Merci

    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/ * * * * *

  3. #3
    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
    Citation Envoyé par dionediate Voir le message
    j'ai une table qui n'a qu'une seule colonne
    Déjà ça c'est bizarre !
    Que représentent ces nombres ? Ils ne peuvent être reliés à rien ! Quel est l'intérêt de cette table ?

    je voudrais alors faire une requete qui me permetrait d'avoir:
    1-seulement les nombres qui n'ont pas d'opposé. pour ce cas precis on a:
    2500
    3200
    4000
    Ça c'est pas dur !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT nombre
    FROM la_table t1
    WHERE NOT EXISTS
    (
      SELECT *
      FROM la_table t2
      WHERE t2.nombre = -(t1.nombre)
    2-pour le nombre 30000 par exemple, les nombres -20000 et -10000 qui se suivent donne une somme egale à -30000 qui est l'opposé du nombre 30000. Pour ces cas pareille, je veux pas que ma requete m'affiche le nombre 30000.
    Ça c'est plus compliqué car combien peut-on prendre de nombres dans l'addition à faire ?
    (-10000) + (-17000) + (-3000) = -30000
    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 !

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    les nombres -20000 et -10000 qui se suivent
    Problème, les lignes ne se suivent pas dans un SGBDR, on les trie en utilisant ORDER BY.
    Ce n'est pas parce que dans l'outils que tu utilises pour visualiser ta table ces lignes semblent apparaitre toujours dans cet ordre que c'est acquis. Le seul moyen, c'est ORDER BY.

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 18
    Points
    18
    Par défaut requete sql firebird
    mon probleme est un pe specifique.
    les donnees que je vous ai montrer sont les seules dans ma table ESSAI qui n'a qu'une seule colonne. et ces donnees sont:
    5000
    2500
    -5000
    6000
    30000
    -6000
    3200
    -20000
    -10000
    4000
    et je voudrais alors savoir si c'est possible de realiser la requete que je veux à savoir: obtenir seulement les nombres qui n'ont pas d'opposé.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Avez-vous testé la solution de Cinephil ?

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Concernant le point 2 est ce que -10000 et -20000 doivent aussi être exclu du résultat ?
    Par ailleurs en ligne 2 et 3 :
    2500 + (-5000) = -2500 donc potentiellement 2500 ne devrait pas apparaître dans le résultat...

    Il nous faudrait plus d'éléments pour comprendre la logique et nous donner le résultat exact souhaité.

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 18
    Points
    18
    Par défaut requete sql firebird
    la solution de Cinephil porte sur deux tables t1 et t2 ; alors moi je n'ai qu'une seule table.
    Pour Skuatmad, je voudrais te dire que tu as parfaitement raison; 2500 ne devrait pa apparaitre dans le resultat de ma requete; je dois seulement avoir 3200 et 4000.
    Je precise encore: je n'ai qu'une seule table ESSAI et une seule colonne qui contient des nombres cités ci haut.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Donc vous n'avez ni essayé ni même lu la requête.

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    La solution de cinephil n'utilise pas 2 tables mais 2 fois la même table avec un alias.

    Concernant la problématique des sommes je prends ça comme un "exercice de style" en SQL même si je n'ai rien compris au pourquoi de cette table et au besoin de la requête.

    Il FAUT donc que tu rajoutes une colonne ordre pour déterminer l'ordre des lignes, comme ci-dessous (vu le nombre de ligne ça n'est pas très dur de le faire à la main si nécessaire) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select * from essai;
     
         ORDRE          C
    ---------- ----------
             1       5000
             2       2500
             3      -5000
             4       6000
             5      30000
             6      -6000
             7       3200
             8     -20000
             9     -10000
            10       4000
    Ensuite il aurait été préférable d'utiliser les fonctions de fenêtrage lead et lag mais comme je ne pense pas que firebird les ai implémentées je suis passé par des requêtes corrélées.

    Comme pour la requête de cinephil je n'utilise que ta table essai mais je l'appelle de nombreuses fois d'où les alias.
    Il y a surement plus astucieux, j'y suis allé un peu au chausse pied, et ça nécessite de faire des tests avec d'autres valeurs mais voilà une piste en tout cas :
    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 * from essai e5
    where not exists ( select 1
    		   from (
    			select t.c as c1 ,t3.c as c2
    			from essai t
    			JOIN (select c
    			     	, c + (select c from essai e2 where e2.ordre = e.ordre +1) as somme_1
    			     	, c + (select c from essai e3 where e3.ordre = e.ordre -1) as somme_2	
    				from essai e
    				) t3 ON t.c = -t3.c OR t.c = -t3.somme_1 OR t3.c = -t3.somme_2
    			) t4
    		    where e5.c = t4.c1 or e5.c = t4.c2
    		)
     
         ORDRE          C
    ---------- ----------
             7       3200
            10       4000
    Pour ce qui est de la compréhension de la requête je te laisse exécuter les différentes sous-requêtes une à une pour comprendre le fonctionnement.

    [EDIT]Au fait pour pouvoir insérer supprimé des nouvelles lignes dans essai ma solution à base de ordre+1 -1 n'est vraiment pas suffisante donc plutôt cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select * from essai e5
    where not exists ( select 1
    		from (
    			select t.c as c1 ,t3.c as c2
    			from essai t
    			JOIN (select c
    			     	, c + (select c from essai e2 where e2.ordre = (select min(e4.ordre) from essai e4 where e4.ordre > e.ordre)) as somme_1
    			     	, c + (select c from essai e5 where e5.ordre = (select max(e6.ordre) from essai e6 where e6.ordre < e.ordre)) as somme_2	
    				from essai e
    				) t3 ON t.c = -t3.c OR t.c = -t3.somme_1 OR t3.c = -t3.somme_2
    			) t4
    		where e5.c = t4.c1 or e5.c = t4.c2
    		)

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 31
    Points : 18
    Points
    18
    Par défaut requete sql firebird
    Merci skuatamad pour ta solution qui marche parfaitement avec firebird. mais quand j'essaie d'executer cette meme requete avec le sybase, j'ai le message suivant " [sybase][ODBC Driver][SQL anywhere]syntax error near 'NOT' on line 1
    j'arrive pas a m'en sortir.
    Alors si tu peux bien me donner encore un coup de main.

    cordialement

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Je ne connais pas du tout Sybase mais la requête n'utilise aucune syntaxe spécifique, peut être est ce un problème d'alias, essaie peut être en mettant AS avant chaque alias de sous-requête.

Discussions similaires

  1. Requete SQL pour Firebird 1.5
    Par pit2121 dans le forum SQL
    Réponses: 2
    Dernier message: 31/07/2007, 17h58
  2. Problème Requete SQL et QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/01/2004, 09h31
  3. requete sql
    Par autumn319 dans le forum ASP
    Réponses: 22
    Dernier message: 10/09/2003, 16h46
  4. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

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