T-Sql Query - получите уникальные строки в двух столбцах - PullRequest
5 голосов
/ 27 августа 2009

У меня есть набор данных со столбцами x и y. Этот набор содержит строки, в которых для любых двух заданных значений A и B есть строка с A и B в столбцах x и y соответственно, и будет вторая строка с B и A в столбцах x и y соответственно.

* 1003 например *

        **Column X**            **Column Y**
Row 1        A                       B
Row 2        B                       A             
  • Есть несколько пар данных в этот набор, который следует этому правилу.
  • Для каждой строки с A, B в столбцах X и Y, всегда будет ряд с B, A в X и Y
  • Столбцы X и Y имеют тип int

Мне нужен запрос T-Sql, который при наличии набора с вышеуказанными правилами вернет мне строку 1 или строку 2, но не оба.

Либо ответ очень труден, либо он настолько прост, что я не вижу леса за деревьями, так или иначе, он ведет меня вверх по стене.

Ответы [ 4 ]

9 голосов
/ 27 августа 2009

Добавьте к вашему запросу предикат,

where X < Y

и вы никогда не получите второй ряд, но всегда получите первый.

(Это предполагает, что когда вы писали «два заданных значения», вы имели в виду два различных заданных значения; если два значения могут быть одинаковыми, добавьте предикат where X <= Y (чтобы избавиться от всех) "перевернутые" строки, где X> Y), а затем добавьте distinct в список выбора (чтобы свернуть любые две строки, где X == Y, в одну строку).)

В ответ на комментарии:

То есть, если в данный момент ваш запрос select foo, x, y from sometable where foo < 3;, измените его на select foo, x, y from sometable where foo < 3 and x < y; или для второго случая (где X и Y не являются разными значениями) select distinct foo, x, y from sometable where foo < 3 and x <= y;.

1 голос
/ 27 августа 2009

Это должно работать.

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
0 голосов
/ 27 августа 2009
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)

Я не пробовал это. Но это должно сработать.

0 голосов
/ 27 августа 2009

Чтобы получить самые высокие и самые низкие значения каждой пары, вы можете использовать:

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

Так что теперь используйте DISTINCT, чтобы получить их пары.

SELECT DISTINCT 
  (X+Y+ABS(X-Y)) / 2 as High, (X+Y-ABS(X-Y)) / 2 as Low 
FROM YourTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...