T-SQL Query - Obter linhas exclusivas por 2 Colunas

votos
5

I tem um conjunto de dados, com colunas x e y. Este grupo contem fileiras em que, por quaisquer valores dados 2, A e B, há uma fila com A e B em colunas x e y respectivly e haverá uma segunda linha com B e A em colunas x e y respectivly.

Por exemplo

        **Column X**            **Column Y**
Row 1        A                       B
Row 2        B                       A             
  • Há vários pares de dados neste conjunto que seguir esta regra.
  • Para cada linha com A, B em colunas X e Y, haverá sempre uma fila com B, A, em que X e Y
  • Colunas X e Y são do tipo int

Eu preciso de uma consulta T-SQL que dado um conjunto com as regras acima irá me retornar tanto Linha 1 ou Linha 2, mas não ambos.

Ou a resposta é muito difícil, ou a sua tão fácil que eu não consigo ver a floresta para as árvores, de qualquer forma isso está me deixando louca.

Publicado 27/08/2009 em 01:10
fonte usuário
Em outras línguas...                            


4 respostas

votos
9

Adicione à sua consulta o predicado,

where X < Y

e você nunca pode obter linha dois, mas sempre terá remar um.

(Isso pressupõe que quando você escreveu "dois valores consignados" você quis dizer dois distintos valores dados; se os dois valores pode ser o mesmo, adicione o predicado where X <= Y(para se livrar de todos "revertida" linhas onde X> Y) e, em seguida, adicionar um distinctà sua lista (a entrar em colapso quaisquer duas linhas onde X == Y em uma linha).)

Em resposta aos comentários:

Ou seja, se atualmente sua consulta é select foo, x, y from sometable where foo < 3;alterá-lo para select foo, x, y from sometable where foo < 3 and x < y;, ou para o segundo caso (onde X e Y não são valores distintos) select distinct foo, x, y from sometable where foo < 3 and x <= y;.

Respondeu 27/08/2009 em 01:20
fonte usuário

votos
1

Isso deve funcionar.

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
Respondeu 27/08/2009 em 01:21
fonte usuário

votos
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)

Eu não tentei isso. Mas, isso deve funcionar.

Respondeu 27/08/2009 em 01:20
fonte usuário

votos
0

Para obter a maior e menor de cada par, você poderia usar:

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

Então agora usar DISTINCT para obter os pares deles.

SELECT DISTINCT 
  (X+Y+ABS(X-Y)) / 2 as High, (X+Y-ABS(X-Y)) / 2 as Low 
FROM YourTable
Respondeu 27/08/2009 em 01:19
fonte usuário

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