Limite des requête imbriqué dans la clause FROM

Limite des requête imbriqué dans la clause FROM - SQL/NoSQL - Programmation

Marsh Posté le 14-04-2011 à 14:56:44    

Bonjour à tous.
 
Avant tous, veuillez m'excuser si un sujet similaire existe, j'ai fait une recherche, mais je n'ai pas vraiment trouvé la réponse à ma question...
 
En gros je voulais savoir si il existe une limite pour la définition de la clause FROM avec des sous requête ?
 
J'ai une requête qui est correcte qui me créé Table1 et Table2 à partir de requête. Les deux requêtes qui génère Table1 et Table2, fonctionne lorsque je les exécute séparément. Mais lorsque je les utilise dans un SELECT... Ca ne passe pas. Le message d'erreur est que ma table Table1 n'existe pas.
 
A noter que les requêtes qui génère Table1 et Table2 génère elle même 2 table TableA et TableB...
 
Bref voici l'exemple :
 

Code :
  1. SELECT DISTINCT(A.Champ1), B.Champ2, B.Champ3,  A.Credit, B.Debit
  2. FROM (
  3. SELECT CumulC.sjr as Champ1, CumulC.Champ2, CumulC.Champ3, sum(CumulC.CumulCredit) as Credit
  4. FROM (
  5.  SELECT lf.sjr, lp.Champ2, lp.Champ3,
  6.  sum(montant) as CumulCredit
  7.  FROM lr, lf, ls, lp 
  8.  WHERE lr.id = lf.id
  9.  AND lf.id = ls.id
  10.  AND ls.nip = lp.nip
  11.  AND ls.module = 1
  12.  AND ls.dateC >= '20100414'
  13.  AND ls.mode IN (1,2,4,6)
  14.  GROUP BY lf.sjr, lp.Champ1, lp.Champ2
  15.  UNION ALL
  16.  SELECT lf.sjr as Champ1, lp.Champ2, lp.Champ3, sum(la.act_mnttotal) AS CumulCredit
  17.  FROM la, lf, ls, lp
  18.  WHERE la.id = lf.id
  19.  AND lf.id = ls.id
  20.  AND ls.id = lp.id
  21.  AND ls.module = 1
  22.  AND ls.dateC >= '20100414'
  23.  AND act = 0
  24.  AND (lf.etat in (3,2) AND la.act = lf.fac_no)
  25.  AND (la.act = lf.fac_no OR la.act = '')
  26.  AND la.datedeb BETWEEN lf.datefac AND lf.datefin
  27.  AND lf.avoir = 1
  28.  GROUP BY  lf.sjr as Champ1, lp.Champ1, lp.Champ2
  29.  ) CumulC
  30. GROUP BY CumulC.Champ1, CumulC.Champ2, CumulC.Champ3
  31. ) A,
  32. (
  33. SELECT CumulD.sjr as Champ1, CumulD.Champ2, CumulD.Champ3, SUM(CumulD.CumulDebit) as Debit 
  34. FROM ( 
  35.  SELECT lf.sjr, lp.Champ2, lp.Champ3,
  36.  SUM(montant) as CumulDebit 
  37.  FROM lr, lf, ls, lp 
  38.  WHERE lr.id = lf.id
  39.  AND lf.id = ls.id
  40.  AND ls.id = lp.id
  41.  AND ls.module = 1
  42.  AND ls.dateC >= '20100414'
  43.  AND ls.mode IN (3,5) 
  44.  GROUP BY lf.sjr, lp.Champ2, lp.Champ3 
  45.  UNION
  46.  SELECT lf.sjr as Champ1, lp.Champ2, lp.Champ3,
  47.  sum(la.mnttotal) AS CumulDebit 
  48.  FROM la, lf, ls, lp
  49.  WHERE la.id = lf.id
  50.  AND lf.id = ls.id
  51.  AND ls.id = lp.id
  52.  AND ls.module = 1
  53.  AND ls.dateC >= '20100414'
  54.  AND la.act = 0
  55.  AND (lf.etat in (3,2) AND la.act = lf.fac_no)
  56.  AND (la.act = lf.fac_no OR la.act = '')
  57.  AND la.datedeb BETWEEN lf.datefac AND lf.datefin
  58.  AND lf.avoir = 0
  59.  GROUP BY  lf.sjr, lp.Champ2, lp.Champ3
  60.  ) CumulD 
  61. GROUP BY CumulD.sjr, CumulD.Champ2, CumulD.Champ3
  62. ) B
  63. WHERE A.Champ1 = B.Champ1
  64. ORDER BY Champ1


 
Merci d'avance de toute l'aide que vous pourrez m'apporter.

Reply

Marsh Posté le 14-04-2011 à 14:56:44   

Reply

Marsh Posté le 14-04-2011 à 15:06:33    

Et c'est quoi le vrai message d'erreur, là?Je ne vois "Table1" nulle part...
 
T'as pas essayé via des jointures, ton machin, là, sinon? Parce-que ça pique les yeux à lire, quand même...d'autant que les sous-requêtes utilisent toutes les mêmes tables ou presque, ça a pas l'air franchement optimal...[:joce]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 14-04-2011 à 15:08:39    

je me permets de reposter ta requête avec coloration syntaxique, histoire d'essayer d'y voir plus clair.

 
Code :
  1. SELECT DISTINCT(A.Champ1), B.Champ2, B.Champ3,  A.Credit, B.Debit
  2. FROM (
  3.  SELECT CumulC.sjr AS Champ1, CumulC.Champ2, CumulC.Champ3, sum(CumulC.CumulCredit) AS Credit
  4.  FROM (
  5.     SELECT lf.sjr, lp.Champ2, lp.Champ3, sum(montant) AS CumulCredit
  6.     FROM lr, lf, ls, lp
  7.     WHERE lr.id = lf.id
  8.     AND lf.id = ls.id
  9.     AND ls.nip = lp.nip
  10.     AND ls.module = 1
  11.     AND ls.dateC >= '20100414'
  12.     AND ls.mode IN (1,2,4,6)
  13.     GROUP BY lf.sjr, lp.Champ1, lp.Champ2
  14.     UNION ALL
  15.     SELECT lf.sjr AS Champ1, lp.Champ2, lp.Champ3, sum(la.act_mnttotal) AS CumulCredit
  16.     FROM la, lf, ls, lp
  17.     WHERE la.id = lf.id
  18.     AND lf.id = ls.id
  19.     AND ls.id = lp.id
  20.     AND ls.module = 1
  21.     AND ls.dateC >= '20100414'
  22.     AND act = 0
  23.     AND (lf.etat IN (3,2) AND la.act = lf.fac_no)
  24.     AND (la.act = lf.fac_no OR la.act = '')
  25.     AND la.datedeb BETWEEN lf.datefac AND lf.datefin
  26.     AND lf.avoir = 1
  27.     GROUP BY  lf.sjr AS Champ1, lp.Champ1, lp.Champ2
  28.  ) CumulC
  29.  GROUP BY CumulC.Champ1, CumulC.Champ2, CumulC.Champ3
  30. ) A,
  31. (
  32.  SELECT CumulD.sjr AS Champ1, CumulD.Champ2, CumulD.Champ3, SUM(CumulD.CumulDebit) AS Debit
  33.  FROM (
  34.     SELECT lf.sjr, lp.Champ2, lp.Champ3, SUM(montant) AS CumulDebit
  35.     FROM lr, lf, ls, lp
  36.     WHERE lr.id = lf.id
  37.     AND lf.id = ls.id
  38.     AND ls.id = lp.id
  39.     AND ls.module = 1
  40.     AND ls.dateC >= '20100414'
  41.     AND ls.mode IN (3,5)
  42.     GROUP BY lf.sjr, lp.Champ2, lp.Champ3
  43.     UNION
  44.     SELECT lf.sjr AS Champ1, lp.Champ2, lp.Champ3, sum(la.mnttotal) AS CumulDebit
  45.     FROM la, lf, ls, lp
  46.     WHERE la.id = lf.id
  47.     AND lf.id = ls.id
  48.     AND ls.id = lp.id
  49.     AND ls.module = 1
  50.     AND ls.dateC >= '20100414'
  51.     AND la.act = 0
  52.     AND (lf.etat IN (3,2) AND la.act = lf.fac_no)
  53.     AND (la.act = lf.fac_no OR la.act = '')
  54.     AND la.datedeb BETWEEN lf.datefac AND lf.datefin
  55.     AND lf.avoir = 0
  56.     GROUP BY  lf.sjr, lp.Champ2, lp.Champ3
  57.  ) CumulD
  58.  GROUP BY CumulD.sjr, CumulD.Champ2, CumulD.Champ3
  59. ) B
  60. WHERE A.Champ1 = B.Champ1
  61. ORDER BY Champ1


Message édité par skeye le 14-04-2011 à 15:13:01

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 14-04-2011 à 15:14:16    

Pardon oui...
 
En fait Table1 = A et Table2 = B
 
L'histoire que je racontais était plus un exemple...
 
Le message d'erreur est ~:
 
"Impossible d'initialiser la requête, le fichier A n'existe pas.

Reply

Marsh Posté le 14-04-2011 à 15:15:56    

C'est quoi comme sgbd?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 14-04-2011 à 15:17:40    

J'en ai essayé deux, car un je ne fais pas vraiment confiance... Et j'ai le même message d'erreur...
 
- HyperFile C/S
- MySQL

Reply

Marsh Posté le 14-04-2011 à 15:19:09    

HyperFile j'imagine, pour ton message d'erreur? M'étonnerait que ce genre de sport fonctionne là-dessus...
C'est quoi le message sous mysql? Quelle version?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 14-04-2011 à 15:20:24    

Mais quelque soit le SGBD, je n'utilise aucune syntaxe SQL (à ma connaissance) qui a des particularité...  
 
Comme decode et case etc... Tous ce que j'utilise sont des instructions de base de SQL (SELECT, FROM, WHERE, GROUP BY, SUM, ORDER BY)

Reply

Marsh Posté le 14-04-2011 à 15:21:16    

Les sgbd ne supportent pas tous 100% du sql "de base"... ;)


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 14-04-2011 à 15:27:39    

Humm ok je viens de trouver...
 
Le test que j'avais effectué sur MySQL était légèrement différent et une erreur c'était glissé.  
En mettant exactement ce que je dois exécuter sur HyperFile C/S dans MySQL ca a fonctionné...
 
Conclusion, tu avais raison.  
 
"M'étonnerait que ce genre de sport fonctionne là-dessus... "  
Je confirme donc.

Reply

Marsh Posté le 14-04-2011 à 15:27:39   

Reply

Marsh Posté le 16-04-2011 à 21:40:35    

bonsoir à tout le monde j'ai un probleme que j'aimerai aoir de l'aide veuillez m'expliquer les codes suivants:
SQL> Declare
2 LN$Num pls_integer := 0 ;
3 Begin
4 Loop
5 LN$Num := LN$Num + 1 ;
6 dbms_output.put_line( to_char( LN$Num ) ) ;
7 EXIT WHEN LN$Num > 3 ; -- sortie de la boucle lorsque LN$Num est supétieur à 3
8 End loop ;
9 End ;
10 /
1
2
3
4
Procédure PL/SQL terminée avec succès.
 
SQL> Declare
2 LN$I pls_integer := 0 ;
3 LN$J pls_integer := 0 ;
4 Begin
5 <<boucle1>>
6 Loop
7 LN$I := LN$I + 1 ;
8 Loop
9 LN$J := LN$J + 1 ;
10 dbms_output.put_line( to_char( LN$I ) || ',' || to_char( LN$J ) ) ;
11 EXIT boucle1 WHEN LN$J > 3 ;
12 End loop ;
13 End loop ;
14 End ;
15 /
1,1
1,2
1,3
1,4
Procédure PL/SQL terminée avec succès.

Reply

Marsh Posté le 16-04-2011 à 22:42:37    

Non. Crée un topic pour ton problème au lieu de squatter celui des autres.


---------------
Can't buy what I want because it's free -
Reply

Sujets relatifs:

Leave a Replay

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