2012-07-10 6 views
2

Le schéma de base de données est organisé comme suit:requête SQL pour obtenir toutes les lignes avec des valeurs en double, mais ne font pas partie du même groupe

ID | GroupID | VALUE 
-------------------- 
1 | 1 | A 
2 | 1 | A 
3 | 2 | B 
4 | 3 | B 

Dans cet exemple, je veux obtenir toutes les lignes avec une valeur double, mais ne font pas partie du même groupe. L'ensemble de résultats souhaité doit donc être ID (3, 4), car ils ne font pas partie du même groupe (2, 3) mais ont toujours la même valeur (B).

Je rencontre des problèmes lors de l'écriture d'une requête SQL et j'apprécierais toute aide. Merci. Jusqu'à présent, j'utilise SQL Count, mais je ne sais pas quoi faire avec GroupId.

SELECT * 
FROM TABLE T 
HAVING COUNT(T.VALUE) > 1 
GROUP BY ID, GroupId, VALUE 
+0

Quel est le moteur de base de données et la version que vous utilisez? – Lamak

Répondre

6

La méthode la plus simple pour cela est d'utiliser EXISTS:

SELECT 
    ID 
FROM 
    MyTable T1 
WHERE 
    EXISTS (SELECT 1 
      FROM MyTable 
      WHERE Value = t1.Value 
      AND GroupID <> t1.GroupID) 
1

Voici une méthode. D'abord, vous devez identifier les valeurs qui apparaissent dans plus d'un groupe, puis utiliser ces informations pour trouver les lignes à droite dans la table d'origine:

select * 
from t 
where value in (SELECT value 
       FROM TABLE T 
       GROUP BY VALUE 
       HAVING COUNT(distinct groupid) > 1 
       ) 
order by value 

En fait, je préfère une légère variante dans ce cas, en changeant la HAVING:

HAVING min(groupid) <> max(groupid) 

Cela fonctionne lorsque vous êtes à la recherche de plus d'un groupe et devrait être plus rapide que le nombre DISTINCT la version.

0
SELECT ALL_.* 
FROM (SELECT * 
     FROM TABLE_ 
     GROUP BY ID, GROUPID, VALUE 
     ORDER BY ID) GROUPED, 
     TABLE_ ALL_ 
WHERE GROUPED.VALUE = ALL_.VALUE 
AND  GROUPED.GROUPID <> ALL_.GROUPID 
+0

Je ne sais pas quoi faire de cette syntaxe. Pourquoi diable faites-vous un "CARTÉSIEN"? Pourquoi ajoutez-vous un soulignement à vos alias de table? – JNK

Questions connexes