T-SQL dotaz - Získat jedinečné řádky přes 2 sloupce

hlasů
5

Mám soubor údajů, se sloupy x a y. Tato sada obsahuje řádky, kde, pro jakékoliv dané hodnoty 2, A a B, je zde řada s A a B, ve sloupcích X a Y respectivly a bude druhý řádek s B a ve sloupcích x a y respectivly.

Např

        **Column X**            **Column Y**
Row 1        A                       B
Row 2        B                       A             
  • Existuje několik dvojice údajů v této sadě, které následují toto pravidlo.
  • Pro každý řádek s A, B ve sloupcích X a Y, budou vždy existovat řádek s B, A v X a Y
  • Sloupce X a Y jsou typu int

Potřebuji T-SQL dotazu, který daný soubor s pravidly výše mi vrátí buď Řádek 1 nebo Řádek 2, ale ne obojí.

Buď odpověď je velmi obtížné, nebo je to tak snadné, že nemohu vidět les pro stromy, ať tak či onak to mě dohání po zdi.

Položena 27/08/2009 v 01:10
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
9

Přidat do dotazu predikát,

where X < Y

a můžete si nikdy řádek dva, ale vždy dostat řádek jeden.

(To předpokládá, že pokud jste napsal „dvě dané hodnoty“ jste měl na mysli dvě odlišné dané hodnoty, pokud tyto dvě hodnoty mohou být stejné, přidat predikát where X <= Y(zbavit se všech „obrácený“ řádky, kde X> Y) a poté se přidá distinctdo svého seznamu select (sbalit nějaké dva řádky, kde X == Y do jednoho řádku).)

V odpovědi na připomínky:

To znamená, že pokud v současné době váš dotaz je select foo, x, y from sometable where foo < 3;změnit jej select foo, x, y from sometable where foo < 3 and x < y;, nebo na druhém případě (kde jsou X a Y nejsou odlišné hodnoty) select distinct foo, x, y from sometable where foo < 3 and x <= y;.

Odpovězeno 27/08/2009 v 01:20
zdroj uživatelem

hlasů
1

To by mělo fungovat.

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
Odpovězeno 27/08/2009 v 01:21
zdroj uživatelem

hlasů
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)

Nezkoušel jsem to. Ale mělo by to fungovat.

Odpovězeno 27/08/2009 v 01:20
zdroj uživatelem

hlasů
0

Chcete-li získat nejvyšší a nejnižší z každého páru, můžete použít:

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

Takže nyní používají odlišné, aby mohly získat párů z nich.

SELECT DISTINCT 
  (X+Y+ABS(X-Y)) / 2 as High, (X+Y-ABS(X-Y)) / 2 as Low 
FROM YourTable
Odpovězeno 27/08/2009 v 01:19
zdroj uživatelem

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