2009-08-27 20 views
5

Tengo un conjunto de datos, con columnas xey. Este conjunto contiene filas donde, para cualquiera de los 2 valores dados, A y B, hay una fila con A y B en las columnas xey respectivamente, y habrá una segunda fila con B y A en las columnas xey respectivamente.Consulta T-SQL: obtenga filas únicas en 2 columnas

por ejemplo

 **Column X**   **Column Y** 
Row 1  A      B 
Row 2  B      A    
  • Existen múltiples pares de datos en este conjunto que siguen esta regla.
  • Para cada fila con A, B en las Columnas X e Y, siempre habrá una fila con B, A en X e Y
  • Columnas X e Y son de tipo int

I Necesito una consulta T-Sql que, dado un conjunto con las reglas anteriores, me devuelva la Fila 1 o la Fila 2, pero no ambas.

O la respuesta es muy difícil, o es tan fácil que no puedo ver el bosque por los árboles, de cualquier manera me está conduciendo por la pared.

+0

Wow, no he hecho nada desde que publicaste esta pregunta. –

+0

Después de publicar esto aquí, logré dormir durante unas horas. Estaremos probando las respuestas más tarde en esta mañana. –

Respuesta

9

Añadir a la consulta del predicado,

where X < Y 

y nunca se puede conseguir la fila dos, pero siempre se obtiene la fila uno.

(Esto supone que cuando escribió "dos valores dados" que quería decir dos valores dados distintos; si los dos valores pueden ser los mismos, añadir el predicado where X <= Y (para deshacerse de todos "invierte" filas donde x > y) y luego añadir un distinct a su lista de selección (a colapsar cualquier par de filas en las que X == y en una sola fila))

En respuesta a los comentarios:.

es decir, si actualmente la consulta, esto select foo, x, y from sometable where foo < 3; cámbielo a select foo, x, y from sometable where foo < 3 and x < y;, o para el segundo caso (donde X e Y no son valores distintos) select distinct foo, x, y from sometable where foo < 3 and x <= y;.

+0

Acabo de ejecutar una prueba y esto no funcionó. – ChaosPandion

+0

Caos, ¿en qué conjunto de datos ejecutó su prueba? – tpdi

+0

Su solución funciona. Mis disculpas. – ChaosPandion

0

Para obtener el máximo y mínimo de cada par, se puede utilizar:

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

Así que ahora para uso distinto para obtener los pares de ellos.

SELECT DISTINCT 
    (X+Y+ABS(X-Y))/2 as High, (X+Y-ABS(X-Y))/2 as Low 
FROM YourTable 
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) 

No he probado esto. Pero, esto debería funcionar.

1

Esto debería 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 
+0

¿Cuidar para explicar el voto negativo? – ChaosPandion

+0

No te voté, pero la respuesta más votada es mucho mejor que esta, parece una solución de procedimiento para un problema establecido. –

+0

No te voté tampoco, pero usar temp table, un while loop, y luego seleccionar y eliminar para cada iteración de ese loop, es una gran cantidad de overkill. No necesita el cursor, y si lo hizo, ¿por qué no simplemente usar un cursor, en lugar de hacer rodar su propio (menos eficiente) "cursor en un ciclo while"? Como dice Sam, te estás acercando a esto de una manera procedural, no usando las herramientas establecidas que te ofrece una base de datos. – tpdi

Cuestiones relacionadas