2010-03-05 3 views
4

Probablement, cela a déjà été demandé mais je ne trouve pas de réponse.Récupère des combinaisons uniques de deux valeurs de champ

Tableau de données comporte deux colonnes:

Source Dest 
1   2 
1   2 
2   1 
3   1 

J'essayant de trouver un MS Access 2003 requête SQL qui retourne:

1  2 
3  1 

Mais en vain. S'il vous plaît aider!

MISE À JOUR: exactement, j'essaie d'exclure 2,1 parce que 1,2 déjà inclus. Je n'ai besoin que de combinaisons uniques où la séquence n'a pas d'importance.

+2

2 - 1 Est-il également unique, devrait-il être exclu? –

+1

Pourquoi 2,1 seraient-ils exclus? Est-il beacuase 1,2 est inclus? Et comment décidez-vous lequel utiliser 1,2 ou 2,1? –

+0

2,1 devrait être exclu, c'est le problème –

Répondre

2

Pour Ms Access, vous pouvez essayer

SELECT DISTINCT 
     * 
FROM Table1 tM 
WHERE NOT EXISTS(SELECT 1 FROM Table1 t WHERE tM.Source = t.Dest AND tM.Dest = t.Source AND tm.Source > t.Source) 

EDIT:

Exemple avec des données de table, qui est le même ...

SELECT DISTINCT 
     * 
FROM Data tM 
WHERE NOT EXISTS(SELECT 1 FROM Data t WHERE tM.Source = t.Dest AND tM.Dest = t.Source AND tm.Source > t.Source) 

ou (Nice et Access formaté ...)

SELECT DISTINCT * 
FROM Data AS tM 
WHERE (((Exists (SELECT 1 FROM Data t WHERE tM.Source = t.Dest AND tM.Dest = t.Source AND tm.Source > t.Source))=False)); 
+0

La première révision renvoie 1,2; 1,2; 3,1 ce qui est évidemment incorrect. –

+0

Je viens d'exécuter cela sur MS Access et il est revenu 1,2 3,1. Avez-vous testé cela? Avez-vous inclus le ** DISTINCT **? –

+0

Astander, copié le un-à-un, juste remplacé Table1 avec des données –

0

Utilisez cette requête:

SELECT distinct * from tabval ; 
+0

Ce n'est pas ce qui a été demandé ... –

0

Pour éliminer les doublons, "select distinct" est plus facile que "groupe par":

select distinct source,dest from data; 

EDIT: Je vois maintenant que vous essayez d'obtenir combinaisons uniques (ne pas inclure à la fois 1,2 et 2,1). Vous pouvez le faire comme:

select distinct source,dest from data 
minus 
select dest,source from data where source < dest 

Le « moins » flips l'ordre autour et élimine les cas où vous avez déjà un match; le "où source < dest" vous empêche de supprimer à la fois (1,2) et (2,1)

+0

renverra 1,2; 2,1; 3; 1 - 2,1 devrait être exclu –

+0

Vous ne pouvez pas utiliser moins dans MS Access, d'où les problèmes :) –

0

votre question est posée incorrectement. "combinaisons uniques" sont tous vos enregistrements. mais je pense que vous voulez dire une ligne par source. il est donc:

SELECT * 
FROM tab t1 
WHERE t1.Dest IN 
(
    SELECT TOP 1 DISTINCT t2.Dest 
    FROM tab t2 
    WHERE t1.Source = t2.Source 
) 
+0

Ne fonctionne pas dans MS Access 2003, se plaint de la clause IN.Btw, juste au cas où il y a un échantillon de sortie désirée dans la question pour éliminer l'ambiguïté possible. –

+0

cette requête va retourner les lignes désirées, mais je n'ai aucune idée de la façon d'écrire dans MS accès sql. – Andrey

+0

Andrey, excuses, j'ai clarifié dans la question que ça doit être Access 2003. –

0
SELECT t1.* FROM 
(SELECT 
    LEAST(Source, Dest) AS min_val, 
    GREATEST(Source, Dest) AS max_val 
FROM table_name) AS t1 
GROUP BY t1.min_val, t1.max_val 

sera de retour

1, 2 
1, 3 

dans MySQL.

Questions connexes