Bête requete ...

Bête requete ... - SQL/NoSQL - Programmation

Marsh Posté le 22-02-2009 à 11:04:45    

Bonjour,

 

Je me prend la tête sur une stupide requête SQL.

 

Nous avons une table ayant cette structure

 

A B C D
a a 3 1111
b b 3 1111
c b 4 1111
z x 3 2222

 


avec A et C comme clè.

 

Nous voulons selectionner les lignes ou pour un D donné, nous avons plusieurs clé différentes.
(par exemple, les lignes pour D = 1111)

 

je pense à :
select *
from T1
group by D
having count(*) > 1;

 

mais passe pas ...
erreur sur le group by


Message édité par Uncle_Scrooge le 22-02-2009 à 11:05:23
Reply

Marsh Posté le 22-02-2009 à 11:04:45   

Reply

Marsh Posté le 22-02-2009 à 13:07:43    

Avec quelle base de données ?
 
Ca ne passe pas car count(*) ne fait pas parti des colonnes du résultat, et que Having est un traitement qui se base sur ces colonnes.
 
A la place, essayer :

Select distinct A, B, C, D from latable T1, latable T2
where T1.D = T2.D
and (T1.A <> T2.A or T1.B <>T2.B or T1.C <> T2.C);

Reply

Marsh Posté le 23-02-2009 à 13:57:46    

Essaie ça aussi  
=>
select * from T1
where D in  
(select D
from T1
group by D
having count(*) > 1);


---------------
il n'y a pas que le VTT dans la vie, il y a le Snowboard aussi ...
Reply

Marsh Posté le 23-02-2009 à 18:47:03    

olivthill a écrit :

Avec quelle base de données ?
Ca ne passe pas car count(*) ne fait pas parti des colonnes du résultat, et que Having est un traitement qui se base sur ces colonnes.


 

vttman2 a écrit :

Essaie ça aussi  
=>
select * from T1
where D in  
(select D
from T1
group by D
having count(*) > 1);


 
Tu as lu olivthill?

Reply

Marsh Posté le 24-02-2009 à 00:17:26    

Ce n'est pas grave. Tout le monde a le droit de proposer des réponses même si elles ne marchent pas (d'ailleurs je me suis moi-même trompé en mettant un test sur B alors que ce champ n'est pas dans la clé).
Uncle_Scrooge fera l'arbitrage (s'il revient un jour ici).

Reply

Marsh Posté le 24-02-2009 à 15:44:19    

Ton SQL est à mon avis valable (il ne tombe pas en erreur...)
 
Je me demande s'il ne voulait pas un truc tout simple comme:
select D, count(*)
from T1
group by D having count(*) > 1;

Reply

Marsh Posté le 25-02-2009 à 14:50:50    

le count(*) n'a pas besoin d'être dans le select pour être utilisé dans le having... ou alors changez de SGBD parce que franchement...

 

par contre, pas de select * sans un group by sur toutes les colonnes de la table (sauf sous mysql qui a un comportement assez imprévisible dans ce cas, mais qui ne rejette pas la requête)


Message édité par MagicBuzz le 25-02-2009 à 14:51:01
Reply

Marsh Posté le 28-02-2009 à 18:09:59    

smilaou a écrit :

Ton SQL est à mon avis valable (il ne tombe pas en erreur...)
 
Je me demande s'il ne voulait pas un truc tout simple comme:
select D, count(*)
from T1
group by D having count(*) > 1;


 
Il faut que je récupère toutes les données de T1 et ça passe avec la proposition d'olivthill :jap:
 

Reply

Marsh Posté le 21-03-2009 à 10:53:02    

Uncle_Scrooge a écrit :


 
Il faut que je récupère toutes les données de T1 et ça passe avec la proposition d'olivthill :jap:
 


 
pour une optimisation des performances :
 
select T1.*  
from T1 inner join  
   (  
   select A, C
   from T1
   group by D having count(*) > 1;
   ) as T2 on ( T1.A = T2.A and T1.C = T2.C )
 

Reply

Sujets relatifs:

Leave a Replay

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