Probleme SQL parait il faisable...

Probleme SQL parait il faisable... - SQL/NoSQL - Programmation

Marsh Posté le 20-01-2006 à 19:54:15    

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
 
 

Reply

Marsh Posté le 20-01-2006 à 19:54:15   

Reply

Marsh Posté le 20-01-2006 à 20:36:23    

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

Reply

Marsh Posté le 20-01-2006 à 20:47:41    

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 ...

Reply

Marsh Posté le 20-01-2006 à 20:49:30    

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).

Reply

Marsh Posté le 20-01-2006 à 20:57:22    

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

Reply

Marsh Posté le 20-01-2006 à 21:00:46    

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
Reply

Marsh Posté le 20-01-2006 à 21:09:25    

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é...)

Reply

Marsh Posté le 20-01-2006 à 21:10:27    

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 ;)

Reply

Marsh Posté le 20-01-2006 à 21:15:07    

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:  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed