Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
922 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme SQL parait il faisable...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme SQL parait il faisable...

n°1288591
vicenzo
parisien néo-lyonnais
Posté le 20-01-2006 à 19:54:15  profilanswer
 

Bonsoir,
 
 J'ai un souci SQL et je ne sais pas s'il est résolvable via seulement SQL (je suis sur Oracle 9)
J'ai une table S1 dont la clé est la combinaison de num_lot et de num_avenant.
 
J'ai 7 enregistrements :
num_avenant num_lot
0 1
0 2
0 3
0 4
1 5
1 6
2 7
 
Et je veux une instruction SQL (une seule, pas de pl/sql autorisé)
qui me créée des lignes de façon à ce que j'ai à la fin
 
0 1
0 2
0 3
0 4
1 1
1 2
1 3
1 4

1 5
1 6
2 1
2 2
2 3
2 4
2 5
2 6

2 7
 
Donc je pensais en gros dire que si le couple num_avenant + 1/num_lot n'existe pas
 déjà dans la table, il faut le créer, maisle num_avenant + 1 ne peut pas dépasser le max (ici 2)
Mais je ne sais pas comment l'écrire en SQL. Et en plus il faudrait appliquer cette règle AUSSI sur les lignes que je viens de créer !
C'est faisable ?
désolé si ma qst est super simple, mais j'y arrive vraiment pas...
 
Merci d'avance
 
 

mood
Publicité
Posté le 20-01-2006 à 19:54:15  profilanswer
 

n°1288617
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-01-2006 à 20:36:23  profilanswer
 

Un truc comme ça ?
 

Code :
  1. select tmp.*
  2. from test t2,
  3. (
  4.  select t1.num_avenant, max(t1.num_lot) num_lot
  5.  from test t1
  6.  group by t1.num_avenant
  7. ) as tmp
  8. where tmp.num_lot >= t2.num_lot

n°1288620
Beegee
Posté le 20-01-2006 à 20:47:41  profilanswer
 

Essaye quelque chose dans le genre de :
 

Code :
  1. SELECT sub.num_avenant, numbers_list.number_value
  2. FROM (SELECT num_avenant, MAX(num_lot) AS max_num_lot
  3.       FROM S1
  4.       GROUP BY num_avenant) sub,
  5.      (SELECT level AS number_value
  6.       FROM dual connect by level <= (SELECT MAX(num_lot) FROM S1) numbers_list
  7. WHERE numbers_list.number_value <= sub.max_num_lot
  8. ORDER BY sub.num_avenant, numbers_list.number_value;


 
sub : contient les couples (num_avenant, num_lot maximum pour ce num_avenant)
 
numbers_list : contient les entiers de 1 au num_lot maxi de la table S1.
 
En faisant la jointure et en mettant cette condition dans la clause WHERE, on devrait pouvoir sortir tout ce que tu veux ...

n°1288621
Beegee
Posté le 20-01-2006 à 20:49:30  profilanswer
 

Arjuna a écrit :

Un truc comme ça ?
 

Code :
  1. select tmp.*
  2. from test t2,
  3. (
  4.  select t1.num_avenant, max(t1.num_lot) num_lot
  5.  from test t1
  6.  group by t1.num_avenant
  7. ) as tmp
  8. where tmp.num_lot >= t2.num_lot



 
Je ne pense pas, je vois pas comment ça pourrait sortir des num_lot qui n'existent pas dans la table (appelée S1 d'ailleurs).

n°1288625
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-01-2006 à 20:57:22  profilanswer
 

En regardant bien son truc "num_lot" est séquentiel, donc à priori, y'a toutes les possibilités dedans. Mais la question n'est pas assez explicite.
 
Sinon, faut remplir une table "num" avec un champ unique, contenant toutes les valeurs de 1 à n avec n >= select max(num_lot) from latable

n°1288630
vicenzo
parisien néo-lyonnais
Posté le 20-01-2006 à 21:00:46  profilanswer
 

euh...
là il n'y a pas insertion des données qui sont en gras dans mon 1er post, ni même la sélection de ces données en gras...
 
ou alors je suis encore moins bon en sql que je ne le pensais...
 
insert into s1 (num_avenant, num_lot)
select
A.num_avenant, A.num_lot
from S1 A
where not exists(select 'X' from S1 B where B.num_avenant + 1 = A.num_avenant and B.num_lot = A.num_lot
                    and B.num_avenant < max(B.num_avenant))
 
Mais ça marche pô...
 
en gros, je voulais dire que si le couple (num_avenant + 1/num_lot) soit par exemple  la 1ere ligne 1 (0 + 1)/1
n'existe pas déjà dans la table, je la crée. Pareil pour la 2ème ligne : le couple 0 + 1 = 1/2 n'existe pas ?  
je crée la ligne. Et ainsi de suite : le couple 1 + 1 = 2/6 n'existe pas ? je le crée !
Et attention, la ligne que j'ai créée (1/2), il faut encore faire le test dessus et comme 1 + 1 =2/2  
n'existe pas non plus, je crée cette ligne aussi
 
Je ne sais pas si je suis compréhensible :(
 
Merci déjà de prendre le temps de me répondre :)
 
edit : oups, je repondais à arjuna, g pas lu la suite


Message édité par vicenzo le 20-01-2006 à 21:01:27
n°1288634
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-01-2006 à 21:09:25  profilanswer
 

Où j'ai utilisé un "not exists" moi ?
 
Recopie déjà la requête et teste-là avant de dire que ça marche pas.
 
Ensuite, oui, ça ne fait qu'un SELECT, on va pas te faire l'INSERT en plus (surtout que tu l'as pas demandé...)

n°1288636
Beegee
Posté le 20-01-2006 à 21:10:27  profilanswer
 

Je t'ai donné le SELECT qui te montre le résultat final de la table.
 
Si tu veux l'INSERT pour combler les trous, c'est simple :
 

Code :
  1. INSERT INTO S1
  2. SELECT sub.num_avenant, numbers_list.number_value
  3. FROM (SELECT num_avenant, MAX(num_lot) AS max_num_lot
  4.       FROM S1
  5.       GROUP BY num_avenant) sub,
  6.      (SELECT level AS number_value
  7.       FROM dual connect by level <= (SELECT MAX(num_lot) FROM S1) numbers_list
  8. WHERE numbers_list.number_value <= sub.max_num_lot
  9. ORDER BY sub.num_avenant, numbers_list.number_value
  10. AND NOT EXISTS
  11. (SELECT NULL
  12. FROM S1
  13. WHERE num_avenant = sub.num_avenant
  14. AND num_lot = numbers_list.number_value);


 
A tester, parce que je me demande si utiliser la même table à la fois dans le SELECT et le INSERT est faisable sans souci ;)

n°1288641
vicenzo
parisien néo-lyonnais
Posté le 20-01-2006 à 21:15:07  profilanswer
 

Arjuna a écrit :

Où j'ai utilisé un "not exists" moi ?
 
Recopie déjà la requête et teste-là avant de dire que ça marche pas.
 
Ensuite, oui, ça ne fait qu'un SELECT, on va pas te faire l'INSERT en plus (surtout que tu l'as pas demandé...)


 
nan, nan, c'est ma requete à moi qui ne marche pas
ne t'énerve pas, je me suis mal exprimé.
 
La base est éteinte (j'étais au boulot) donc je ne pourrai la tester que lundi matin. Ce probleme me trottait méchamment dans la tete, c'est tout encore 1 heure apres
 
Merci à toi et à Beegee de vous être donnés la peine de me répondre
 
Je dirai ce qu'il en est lundi matin.
D'ici là bon we à vous  :hello:  


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Probleme SQL parait il faisable...

 

Sujets relatifs
Probleme autorun pour cdrom[ASP.NET] Problème avec une connection à la base de données
Problème Infopath et JScriptprobleme ordre des fichiers dans une galerie
Probleme ALTER TABLEproblème devc++ et ffmpeg
Problème de sockets TCPProbleme avec ma version JAVA ? j'arrive pas a faire tourner un prog ?
[SQL] REGEX dans mysql_query[SQL] Dupliquer un enregistrement en précisant un des champs
Plus de sujets relatifs à : Probleme SQL parait il faisable...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR