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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°498239
tomlameche
Et pourquoi pas ?
Posté le 26-08-2003 à 10:52:49  profilanswer
 

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é
mood
Publicité
Posté le 26-08-2003 à 10:52:49  profilanswer
 

n°498267
anapajari
s/travail/glanding on hfr/gs;
Posté le 26-08-2003 à 11:06:31  profilanswer
 

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

n°498285
tomlameche
Et pourquoi pas ?
Posté le 26-08-2003 à 11:17:09  profilanswer
 

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é
n°1003347
yellow_pan​ther
Posté le 07-03-2005 à 10:48:53  profilanswer
 

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

n°1003388
thecoin
Chasseur de chasseur de canard
Posté le 07-03-2005 à 11:16:40  profilanswer
 

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.

n°1711497
Le lapin-l​apine
Posté le 02-04-2008 à 11:22:44  profilanswer
 

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
)

n°1711515
casimimir
Posté le 02-04-2008 à 11:32:07  profilanswer
 

tu dois surement virer le values()

n°1711517
Le lapin-l​apine
Posté le 02-04-2008 à 11:38:25  profilanswer
 

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

n°1711524
Le lapin-l​apine
Posté le 02-04-2008 à 11:50:06  profilanswer
 

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:  
 
 

n°1711547
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-04-2008 à 12:15:02  profilanswer
 

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.
mood
Publicité
Posté le 02-04-2008 à 12:15:02  profilanswer
 

n°1711589
Le lapin-l​apine
Posté le 02-04-2008 à 13:52:48  profilanswer
 

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
n°1711612
Le lapin-l​apine
Posté le 02-04-2008 à 14:09:09  profilanswer
 

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
n°1711615
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-04-2008 à 14:14:45  profilanswer
 

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.

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

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

 

Sujets relatifs
Les champs "automatiques" dans une table MySQL[SGBD/Mysql] Choix multiples et stockage en BDD
[PHP/MySQL] Probleme de guillemets : A L'AIDE !![MySQL] Comment incrémenter une valeur contenue dans un tableau ??
Topic sur les livres PHP / MYSQL + opinionsphp et date Oracle[résolu]
[File_exists] equivalent de cette fonction appliquable en rézo ?[MySQL] A quoi sert l'attribut UNIQUE ??
[MySQL] Comparaison avec des type DateTime...[MySQL] Astuce pour qu'un count( ) vide retourne la valeur 0 ?
Plus de sujets relatifs à : DB2 : équivalent au rowcount d'Oracle ou Limit de MySQL ?


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