2010-03-04 9 views
0

J'ai une table d'accès avec deux colonnes (ID et actifs) avec des données telles que les suivantes:accès - Sélectionnez les enregistrements distincts où une seule colonne est distincte

ID | Active 
------------ 
123 | 0 
124 | 0 
125 | 0 
123 | 1 
314 | 1 
948 | 1 

Je veux sélectionner les enregistrements distincts qui ont un ID unique (qui n'existe qu'une seule fois, pas seulement la première fois qu'ils existent), mais j'ai aussi besoin de la valeur Active. Si je fais un

SELECT DISTINCT ID from table1 

Je reçois les ID uniques, mais pas la feuille. Il renvoie également 123, ce qui n'est pas unique dans la table. Si oui:

SELECT DISTINCT * from table1 

Je reçois des ID en double si elles ont des valeurs actives différentes. J'ai besoin d'une requête pour obtenir les ID uniques et leur valeur de feuille associée. Il retournera ce qui suit:

ID | Active 
------------ 
124 | 0 
125 | 0 
314 | 1 
948 | 1 

Dois-je les mettre dans deux tables différentes et faire une jointure externe? Active est seulement toujours 0 ou 1.

Répondre

5

Utilisez ceci:

SELECT * 
FROM table1 
WHERE Id IN (SELECT Id FROM table1 GROUP BY Id HAVING COUNT(Id)=1) 
+0

Cela laissera 123 complètement, tandis que select distinct l'inclurait. – Fionnuala

+0

Je veux laisser de côté 123 - Il devrait être seulement les ID uniques –

+1

@David: Je ne comprends pas. Vous avez dit que vous vouliez "sélectionner les enregistrements distincts qui ont un identifiant unique"; C'est ce que ma réponse proposée fait, en retournant les lignes avec les identifiants 124, 125, 314 et 948, comme vous le demandez dans votre exemple de données de retour. Il ne renvoie pas de lignes avec l'ID 123 car cet ID apparaît deux fois, c'est-à-dire qu'il n'est pas unique. Est-ce que je vous ai bien compris? – CesarGon

1

Pour quelqu'un d'autre, si vous voulez au moins un enregistrement renvoyé pour chaque ID, en omettant les doublons par la suite. Une requête similaire à la sous-requête de CesarGon fonctionnera, à condition que vous voulez que le premier ou le dernier résultat pour Active:

SELECT ID, First(table1.Active) as Active FROM table1 GROUP BY ID; 

qui va vous voulez que vous voulez:

ID | Active 
------------ 
123 | 0 
124 | 0 
125 | 0 
314 | 1 
948 | 1 

Si vous voulez la dernière valeur pour Active :

SELECT ID, Last(table1.Active) as Active FROM table1 GROUP BY ID; 

que vous obtiendrez:

ID | Active 
------------ 
123 | 1 
124 | 0 
125 | 0 
314 | 1 
948 | 1