T-Sql requête - Obtenir des lignes uniques sur 2 colonnes

voix
5

J'ai un ensemble de données, avec des colonnes x et y. Ce kit contient les lignes où, pour toutes les valeurs données 2, A et B, il y a une rangée avec A et B dans les colonnes x et y respectivly et il y aura une deuxième rangée avec B et A dans les colonnes x et y respectivly.

Par exemple

        **Column X**            **Column Y**
Row 1        A                       B
Row 2        B                       A             
  • Il y a plusieurs paires de données dans cet ensemble qui suivent cette règle.
  • Pour chaque ligne A, B dans les colonnes X et Y, il y aura toujours une ligne avec B, A dans X et Y
  • Colonnes X et Y sont de type int

Je besoin d'un T-Sql requête qui donne un ensemble avec les règles ci-dessus me renvoyer soit la ligne 1 ou la ligne 2, mais pas les deux.

Soit la réponse est très difficile, ou son je si facile que pas voir la forêt pour les arbres, de toute façon, il me conduit dans le mur.

Créé 27/08/2009 à 01:10
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
9

Ajouter à votre requête le prédicat,

where X < Y

et vous ne pouvez jamais obtenir la deuxième ligne, mais toujours obtenir la première rangée.

(Cela suppose que lorsque vous avez écrit « deux valeurs données » que vous vouliez dire deux distinctes valeurs données, si les deux valeurs peuvent être les mêmes, ajouter le prédicat where X <= Y(pour se débarrasser de tous « inversé » lignes où X> Y), puis ajouter un distinctà la liste de sélection (pour replier les deux rangées où X == Y dans une rangée).)

En réponse aux commentaires:

Autrement dit, si actuellement votre requête est select foo, x, y from sometable where foo < 3;changer à select foo, x, y from sometable where foo < 3 and x < y;, ou pour le second cas (où X et Y ne sont pas des valeurs distinctes) select distinct foo, x, y from sometable where foo < 3 and x <= y;.

Créé 27/08/2009 à 01:20
source utilisateur

voix
1

Cela devrait fonctionner.

Declare @t Table (PK Int Primary Key Identity(1, 1), A int, B int);

Insert into @t values (1, 2);
Insert into @t values (2, 1);
Insert into @t values (3, 4);
Insert into @t values (4, 3);
Insert into @t values (5, 6);
Insert into @t values (6, 5);

Declare @Table Table (ID Int Primary Key Identity(1, 1), PK Int, A Int, B Int);
Declare @Current Int;
Declare @A Int;

Insert Into @Table 
Select PK, A, B 
From @t;

Set @Current = 1;    

While (@Current <= (Select Max(ID) From @Table) Begin    

    Select @A = A 
    From @Table 
    Where ID = @Current;        

    If (@A Is Not Null) Begin

        Delete From @Table Where B = @A;            
        If ((Select COUNT(*) From @Table Where A = @A) > 1) Begin
            Delete From @Table Where ID = @Current;
        End

    End

    Set @A = Null;  
    Set @Current = @Current + 1;

End

Select a.*
From @tAs a
    Inner Join @Table As b On a.PK = b.PK
Créé 27/08/2009 à 01:21
source utilisateur

voix
0
SELECT O.X, O.Y
FROM myTable O
WHERE EXISTS (SELECT X, Y FROM myTable I WHERE I.X = O.Y AND I.Y = O.X)

Je n'ai pas essayé ça. Mais, cela devrait fonctionner.

Créé 27/08/2009 à 01:20
source utilisateur

voix
0

Pour obtenir le plus haut et le plus bas de chaque paire, vous pouvez utiliser:

(X+Y+ABS(X-Y)) / 2 as High, (X+Y-ABS(X-Y)) / 2 as Low 

Il faut donc utiliser maintenant DISTINCT pour obtenir les paires d'entre eux.

SELECT DISTINCT 
  (X+Y+ABS(X-Y)) / 2 as High, (X+Y-ABS(X-Y)) / 2 as Low 
FROM YourTable
Créé 27/08/2009 à 01:19
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more