Précédent   Forum des professionnels en informatique > Bases de données > Sybase
Sybase Forum sur la base de données Sybase. Avant de poster -> F.A.Q Sybase, Tutoriels Sybase
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/12/2010, 13h22   #1
 
Inscription : avril 2009
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 29
Points : -2
Points : -2
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.
dionediate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 13h57   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
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 950
Points : 17 766
Points : 17 766
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
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/12/2010, 14h10   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
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 : 10 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
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 ?

Citation:
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 :
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)
Citation:
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 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/12/2010, 14h30   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 16h39   #5
 
Inscription : avril 2009
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 29
Points : -2
Points : -2
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é.
dionediate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 16h47   #6
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Avez-vous testé la solution de Cinephil ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 17h28   #7
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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é.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 17h55   #8
 
Inscription : avril 2009
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 29
Points : -2
Points : -2
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.
dionediate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 19h21   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Donc vous n'avez ni essayé ni même lu la requête.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2010, 19h46   #10
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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 :
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 :
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 :
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
		)
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/12/2010, 10h44   #11
 
Inscription : avril 2009
Messages : 29
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 29
Points : -2
Points : -2
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
dionediate est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 11h38   #12
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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.
skuatamad 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 01h26.


 
 
 
 
Partenaires

Hébergement Web