DB2 : équivalent au rowcount d'Oracle ou Limit de MySQL ?

DB2 : équivalent au rowcount d'Oracle ou Limit de MySQL ? - SQL/NoSQL - Programmation

Marsh Posté le 26-08-2003 à 10:52:49    

Salut à tous,
 
Quelqun connaitrait-il un équivalent au rowcount d'Oracle ou au limit de MySQL sous DB2 pour obtenir un nombre limité de résultat dans une requete ?
Par exemple, j'ai une table 1500 enregistrement, et je veux juste récupérer les 15 premiers :
Sous Oracle je fais
SELECT bidule
FROM machin_chose
WHERE bazar = 'trucmuche' and rowcount < 15
 
Y a un equivalent DB2 ?


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 26-08-2003 à 10:52:49   

Reply

Marsh Posté le 26-08-2003 à 11:06:31    

suffit d'ajouter FETCH FIRST n ROWS ONLY à ton select.
Un truc dans le genre:

Code :
  1. select * from tatable FETCH FIRST 5 ROWS ONLY

Reply

Marsh Posté le 26-08-2003 à 11:17:09    

Anapajari a écrit :

suffit d'ajouter FETCH FIRST n ROWS ONLY à ton select.
Un truc dans le genre:

Code :
  1. select * from tatable FETCH FIRST 5 ROWS ONLY

 


Merci !


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 07-03-2005 à 10:48:53    

anapajari a écrit :

suffit d'ajouter FETCH FIRST n ROWS ONLY à ton select.
Un truc dans le genre:

Code :
  1. select * from tatable FETCH FIRST 5 ROWS ONLY



Y a-t-il aussi un moyen de prendre les enregistrments 10 à 20 ?
Equivalent en MySQL :

Code :
  1. SELECT ...
  2. FROM ...
  3. LIMIT 10,10

Reply

Marsh Posté le 07-03-2005 à 11:16:40    

tomlameche a écrit :

Salut à tous,
 
Quelqun connaitrait-il un équivalent au rowcount d'Oracle ou au limit de MySQL sous DB2 pour obtenir un nombre limité de résultat dans une requete ?
Par exemple, j'ai une table 1500 enregistrement, et je veux juste récupérer les 15 premiers :
Sous Oracle je fais
SELECT bidule
FROM machin_chose
WHERE bazar = 'trucmuche' and rowcount < 15
 
Y a un equivalent DB2 ?


 
Juste au passage ta requette est fausse, elle ne retournera que les bazar = 'trucmuche' dans les 15 première lignes de ta table.

Reply

Marsh Posté le 02-04-2008 à 11:22:44    

Bonjour à tous :)
 
Et y'a-t-il moyen d'utiliser ce FETCH FIRST à l'intérieur d'un INSERT ?
 
J'ai une requête SELECT (qui au passage ne renvoie qu'une ligne...) récupérant une heure d'appel d'un module et calculant le temps passé dans ce module :
 

SELECT CURRENT_DATE, CURRENT_TIME, CURRENT_TIME-MAX(HEURE) FROM MaTable WHERE DATE = CURRENT_DATE


(Pour info, MaTable = DATE (DATE) , HEURE (TIME) et TEMPS (INTEGER))
 
Et je voudrais faire l'insertion de cette ligne dans cette même table, mais DB2 me met : "Le mot clé FETCH est mal placé."
Sans ce FETCH, ça me met : "Une sous-requête ne peut générer qu'une seule colonne résultat."
 
Ma requête d'insertion est :

INSERT INTO MaTable VALUES (
   SELECT CURRENT_DATE, CURRENT_TIME, CURRENT_TIME-MAX(HEURE)
   FROM   MaTable
   WHERE  DATE = CURRENT_DATE
   FETCH FIRST 1 ROWS ONLY
)

Reply

Marsh Posté le 02-04-2008 à 11:32:07    

tu dois surement virer le values()

Reply

Marsh Posté le 02-04-2008 à 11:38:25    

casimimir a écrit :

tu dois surement virer le values()


 
Merci pour ta réponse rapide... mais l'erreur persiste, même sans le VALUES.
Pour info, ça me met aussi : "Eléments possibles : ) UNION EXCEPT"
 
J'ai essayé de mettre le FETCH en dehors, mais pas mieux...

Reply

Marsh Posté le 02-04-2008 à 11:50:06    

Le lapin-lapine a écrit :


 
Merci pour ta réponse rapide... mais l'erreur persiste, même sans le VALUES.
Pour info, ça me met aussi : "Eléments possibles : ) UNION EXCEPT"
 
J'ai essayé de mettre le FETCH en dehors, mais pas mieux...


Alors après recherches...

http://bytes.com/forum/thread577146.html


donne :

DB2 for OS/390 doesn't support fetch for subselect nor fullselect even
Version 8.
FETCH is supported for select-statement.
Related part of syntax of INSERT statement is
INSERT INTO table-name|view-name fullselect isolation-clause QUERYNO
integer
DB2 for LUW support fetch for sub-select. So, fetch can be used in
INSERT.


et donc ça semblerait impossible... sauf que, en faisant ça (je ne comprends pas trop le pourquoi du comment), ça marche :

INSERT INTO MaTable WITH MaTable AS (    
   SELECT CURRENT_DATE,                          
          CURRENT_TIME,                          
          CURRENT_TIME-MAX(HEURE),            
   FROM   MaTable            
   WHERE  DATE = CURRENT_DATE                    
   FETCH FIRST 1 ROWS ONLY                        
)  SELECT CURRENT_DATE,                          
          CURRENT_TIME,                          
          CURRENT_TIME-MAX(HEURE),            
   FROM   MaTable  
   WHERE  DATE = CURRENT_DATE                    
   FETCH FIRST 1 ROWS ONLY

         
en gros, j'ajoute WITH MaTable AS au INSERT, et je remets ma requête en dehors... Est-ce que quelqu'un peut m'expliquer ou au moins me confirmer que ça fait bien ce que je veux ?... Merci !!  :bounce:  :sol:  
 
 

Reply

Marsh Posté le 02-04-2008 à 12:15:02    

nan mais .... :/
Si t'avais mis un group by DATE comme tu es censé le faire quand tu utilises un agrégat tu n'aurais pas ce problème...

Code :
  1. INSERT INTO MaTable VALUES (
  2.   SELECT DATE, CURRENT_TIME, CURRENT_TIME-MAX(HEURE)
  3.   FROM   MaTable
  4.   WHERE  DATE = CURRENT_DATE
  5.   GROUP BY DATE
  6. )


Message édité par anapajari le 02-04-2008 à 12:15:13

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 02-04-2008 à 12:15:02   

Reply

Marsh Posté le 02-04-2008 à 13:52:48    

Ben non...

Code :
  1. > INSERT INTO GLI1/EPCLOGVPF VALUES (                              
  2.     SELECT DATE, CURRENT_TIME, CURRENT_TIME-MAX(HEURE)                                        
  3.   FROM   GLI1/EPCLOGVPF  
  4.   WHERE DATE = CURRENT_DATE                
  5.   GROUP BY DATE)                                                  
  6.  Une sous-requête ne peut générer qu'une seule colonne résultat.


 
Il semblerait que l'alias soit indispensable... j'ai pu le simplifier ainsi :

Code :
  1. > INSERT INTO GLI1/EPCLOGVPF
  2.  WITH TABLETEMP AS ( SELECT * FROM   GLI1/EPCLOGVPF )
  3.  SELECT CURRENT_DATE, CURRENT_TIME, CURRENT_TIME-MAX(HEURE)          
  4.     FROM   TABLETEMP
  5.     WHERE  DATE = CURRENT_DATE                    
  6.  1 lignes insérées dans EPCLOGVPF de GLI1.


Et même plus besoin de FETCH FIRST !!
 
Merci à tous pour votre aide :)

Message cité 1 fois
Message édité par Le lapin-lapine le 02-04-2008 à 13:55:31
Reply

Marsh Posté le 02-04-2008 à 14:09:09    

Pour info, autre possibilité par rapport à ce que je voulais faire :
 

Code :
  1. INSERT INTO GLI1/EPCLOGVPF                                  
  2.   SELECT CURRENT_DATE,                                    
  3.          CURRENT_TIME,                                    
  4.          CONCAT('Retour du CMM566 après ', CONCAT(CURRENT_TIME-MAX(HEURE), ' secondes'))
  5.      FROM   GLI1/EPCLOGVPF                                
  6.      WHERE  DATE = CURRENT_DATE


Message édité par Le lapin-lapine le 02-04-2008 à 14:09:30
Reply

Marsh Posté le 02-04-2008 à 14:14:45    

Le lapin-lapine a écrit :

 Une sous-requête ne peut générer qu'une seule colonne résultat.


nan mais ça c'est parce que j'ai recopié comme un couillon ta requête sans regarder hein :o

 

Elle doit s'écrire comme ça :

Code :
  1. INSERT INTO GLI1/EPCLOGVPF
  2.    SELECT DATE, CURRENT_TIME, CURRENT_TIME-MAX(HEURE)                                        
  3.  FROM   GLI1/EPCLOGVPF  
  4.  WHERE DATE = CURRENT_DATE                
  5.  GROUP BY DATE
 

edit: raah burned de 5 minutes ... faut que j'arrête de faire 2 choses en même temps :)
par contre, je le redis un agrégat sans group => :vomi:


Message édité par anapajari le 02-04-2008 à 14:15:35

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Sujets relatifs:

Leave a Replay

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