[SQL] aide sur un SELECT

aide sur un SELECT [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 11-09-2002 à 13:27:00    

J'ai une table table qui contient des données pour différentes personnes repérées par le champ emplid. Ces emplid peuvent avoir plusieurs enregistrements chacun.
Je cherche à isoler tous les emplid qui ont uniquement 2 lignes dans cette table.
Quelle est la condition qui me permet de spécifier le fait que chaque emplid de table n'a que 2 enregistrements ?
Merci pour votre aide

Reply

Marsh Posté le 11-09-2002 à 13:27:00   

Reply

Marsh Posté le 11-09-2002 à 13:29:48    

je ne pense pas qu'une fonction existe pour faire sa, il faut voir avecde structure conditionnel, ect, mais a mon avis ça seras trop long a executer !

Reply

Marsh Posté le 11-09-2002 à 13:36:48    

select emplid, count(*) as c from table where c=2 group by emplid


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 11-09-2002 à 13:37:50    

--greg-- a écrit a écrit :

select emplid, count(*) as c from table where c=2 group by emplid




 
 :ouch:  
 
J'en suis pas encore a se niveau !

Reply

Marsh Posté le 11-09-2002 à 13:38:22    

faudra rebidouiller un peu la requête, mais en gros :
 

Code :
  1. SELECT EMP.*
  2. FORM EMP, (SELECT EMPLID, COUNT(EMPLID) NB FROM EMP GROUP BY EMPLID) as TEMP
  3. WHERE EMP.EMPLID = TEMP.EMPLID
  4. AND TEMP.NB = 2


Message édité par MagicBuzz le 11-09-2002 à 13:40:12
Reply

Marsh Posté le 11-09-2002 à 13:38:52    

Peut être que la fonction rownum pourrait m'aider mais je connais pas vraiment son utilité (je l'ai vu en me baladant sur le forum à la recherche de l'idée géniale)
Qqn aurait un rapide briefing à me faire dessus ?

Reply

Marsh Posté le 11-09-2002 à 13:39:06    

MagicBuzz a écrit a écrit :

faudra rebidouiller un peu la requête, mais en gros :
 

Code :
  1. SELECT EMP.*
  2. FORM EMP, (SELECT EMPLID, COUNT(EMPLID) FROM EMP GROUP BY EMPLID) as TEMP
  3. WHERE EMP.EMPLID = TEMP.EMPLID
  4. AND TEMP.NB = 2





:heink:


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 11-09-2002 à 13:39:10    

--greg-- a écrit a écrit :

select emplid, count(*) as c from table where c=2 group by emplid



Ha ouais ? On peut faire la condition direct sur le COUNT :??:

Reply

Marsh Posté le 11-09-2002 à 13:39:55    

Le Breton a écrit a écrit :

Peut être que la fonction rownum pourrait m'aider mais je connais pas vraiment son utilité (je l'ai vu en me baladant sur le forum à la recherche de l'idée géniale)
Qqn aurait un rapide briefing à me faire dessus ?



quoi ça marche pas ma requete?


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 11-09-2002 à 13:40:12    

MagicBuzz a écrit a écrit :

Ha ouais ? On peut faire la condition direct sur le COUNT :??:



oué


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 11-09-2002 à 13:40:12   

Reply

Marsh Posté le 11-09-2002 à 13:49:17    

--greg-- a écrit a écrit :

select emplid, count(*) as c from table where c=2 group by emplid




 
Je me prends un invalid column name sur c...  :cry:

Reply

Marsh Posté le 11-09-2002 à 13:54:34    

Faut utiliser HAVING:
 
SELECT emplid
FROM empl_t
GROUP BY emplid
HAVING COUNT(emplid) = 2;


---------------
"Colère et intolérance sont les ennemis d'une bonne compréhension." Gandhi
Reply

Marsh Posté le 11-09-2002 à 13:55:17    

Le niveau du forum a baissé ...
C'est pourtant simple:
 
select emplid
from table
group by emplid
having count(*)=2

Reply

Marsh Posté le 11-09-2002 à 13:59:30    

:kaola:


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 11-09-2002 à 14:00:24    

Ben mince, j'aurais pas dû effacer mon post...

Reply

Marsh Posté le 11-09-2002 à 14:00:39    

MagicBuzz a écrit a écrit :

faudra rebidouiller un peu la requête, mais en gros :
 

Code :
  1. SELECT EMP.*
  2. FORM EMP, (SELECT EMPLID, COUNT(EMPLID) NB FROM EMP GROUP BY EMPLID) as TEMP
  3. WHERE EMP.EMPLID = TEMP.EMPLID
  4. AND TEMP.NB = 2






 
En tout cas, ta solution marche ! Merci  :bounce:

Reply

Marsh Posté le 11-09-2002 à 14:01:53    

oh les tueurs avec des requetes de fous pour un truc aussi bateau ... m'etonne pas qu'apres ils arrivent avec la bouche en coeur et un "oh ben j'comprends pas, pourquoi ma requete mets 3 heures a s'executer"  :D

Reply

Marsh Posté le 11-09-2002 à 14:04:02    

thegti a écrit a écrit :

Le niveau du forum a baissé ...
C'est pourtant simple:
 
select emplid
from table
group by emplid
having count(*)=2




 
C'est en effet plus simple mais merci aux autres pour leur aide et surtout pour la reactivité !  :bounce:

Reply

Marsh Posté le 11-09-2002 à 14:41:39    

--greg-- a écrit a écrit :

oué
 




je suis de l'avis de kueger > avec having...
Parceque direct comme ça, je doute que ça marche... tu peux pas faire un filtre sur une donnée calculée dont le résultat peut dépendre du filtre...
 
pour count, chais pas, je m'en sert jamais. mais pour min() ou max() y'a pas moyen en tout cas.
peut-être avec un having... en tout cas ma méthode marche bien et n'est pas plus lente qu'une autre (selon les indexes qui sont créés ;))

Reply

Marsh Posté le 11-09-2002 à 14:42:22    

thegti a écrit a écrit :

Le niveau du forum a baissé ...
C'est pourtant simple:
 
select emplid
from table
group by emplid
having count(*)=2




 
On ne peut pas etre bon partous  :D

Reply

Marsh Posté le 11-09-2002 à 14:52:20    

HappyHarry a écrit a écrit :

oh les tueurs avec des requetes de fous pour un truc aussi bateau ... m'etonne pas qu'apres ils arrivent avec la bouche en coeur et un "oh ben j'comprends pas, pourquoi ma requete mets 3 heures a s'executer"  :D  




Ouais ma c normal, plus habitué à faire des requêtes toutes simples...
 
La requête la plus lisible que j'aie dans le projet que je suis en train de faire c'est celle là :
 

Code :
  1. sqlSearch = "SELECT DISTINCT GENpro.pro_codpro AS pro_codpro, GENpro.fam_fampro AS fam_fampro, GENpro.fam_sfapro AS fam_sfapro, GENpro.fam_ssfpro AS fam_ssfpro, GENprm.prm_name AS Name, GENbrd.brd_libBrand AS Brand, GENpro.pro_codnew AS New, GENpro.pro_ecat AS ecat "&_
  2.   "FROM GENpro, GENprm, GENbrd, TABOURPROMO, GENBIT "&_
  3.   "WHERE GENprm.lan_codlan = ':Language' "&_
  4.   "AND GENprm.pro_codpro = GENpro.pro_codpro "&_
  5.   "AND GENpro.brd_codBrand = GENbrd.brd_codBrand " &_
  6.   "AND GENbit.cou_codpay = ':Country' "&_
  7.   "AND mod(trunc(GENpro.pro_cntdstb/power(2,GENbit.bit_pos), 0), 2) = 1 "&_
  8.   "AND GENpro.pro_codpro = TABOURPROMO.pro_codpro"

Reply

Marsh Posté le 11-09-2002 à 15:48:07    

Tu me rappeleras de.................................................................................................. ne pas postuler où to bosses  :lol:

Reply

Marsh Posté le 11-09-2002 à 15:56:11    

MagicBuzz a écrit a écrit :

 
je suis de l'avis de kueger > avec having...
Parceque direct comme ça, je doute que ça marche... tu peux pas faire un filtre sur une donnée calculée dont le résultat peut dépendre du filtre...
 
pour count, chais pas, je m'en sert jamais. mais pour min() ou max() y'a pas moyen en tout cas.
peut-être avec un having... en tout cas ma méthode marche bien et n'est pas plus lente qu'une autre (selon les indexes qui sont créés ;))




 
Bien sur qu'elle est plus lente ta requête, elle fait 2 passes ... :sarcastic:

Reply

Marsh Posté le 11-09-2002 à 16:14:34    

MagicBuzz a écrit a écrit :

 
je suis de l'avis de kueger > avec having...



oui, autant pour moi
(pourtant jpense l'avoir déjà fait mais jsais plus avec quelle db)


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 11-09-2002 à 17:30:19    

thegti a écrit a écrit :

 
 
Bien sur qu'elle est plus lente ta requête, elle fait 2 passes ... :sarcastic:




Peut-être que sous Ingre ou MySQL elle est deux passes, mais sous Oracle ou SQL Server, elle ne fait qu'une passe. Y'a un optimiseur dans les SGBD c'est pas fait pour faire joli ;)
 
Et deplus, avec des indexes correctement créés, pas une seule ligne de la table n'est lue, donc faire une ou deux passes dans un arbre...

Reply

Marsh Posté le 11-09-2002 à 17:48:54    

--greg-- a écrit a écrit :

oui, autant pour moi
(pourtant jpense l'avoir déjà fait mais jsais plus avec quelle db)




 
pourquoi tu as dejà utiliser beaucoup de db?

Reply

Marsh Posté le 11-09-2002 à 18:01:01    

bob20000 a écrit a écrit :

 
 
pourquoi tu as dejà utiliser beaucoup de db?



nan pas tant que ça:)
(je te vois venir toi :D)


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 12-09-2002 à 09:30:08    

--greg-- a écrit a écrit :

nan pas tant que ça:)
(je te vois venir toi :D)




 :pt1cable:  tu as dejà utilise quel base alors?

Reply

Marsh Posté le 12-09-2002 à 10:06:42    

MagicBuzz a écrit a écrit :

 
Peut-être que sous Ingre ou MySQL elle est deux passes, mais sous Oracle ou SQL Server, elle ne fait qu'une passe. Y'a un optimiseur dans les SGBD c'est pas fait pour faire joli ;)
 
Et deplus, avec des indexes correctement créés, pas une seule ligne de la table n'est lue, donc faire une ou deux passes dans un arbre...




 
:lol: L'optimiseur, il refait ta requête ?
Tu peut même mettre 10 fois la table dans ton from, le SGBD il optimise tout seul pour faire une seule passe ... :sarcastic:
Fait les deux requêtes et affichent les plans d'éxécution, ou mieux encore affichent des temps d'éxécution avec une grosse table, tu verras direct la différence. ;)

Reply

Marsh Posté le 12-09-2002 à 13:58:26    

bob20000 a écrit a écrit :

 
 :pt1cable:  tu as dejà utilise quel base alors?



mysql, interbase, oracle, mssql
mais pour ce que j'ai dis plus haut j'ai pê revé aussi :D


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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