2017-10-09 10 views
0

다른 행과 반대 값을 갖는 행을 포함하는 데이터베이스 테이블을 쿼리하려고합니다. 테이블이역방향/스왑 된 값을 가진 행을 표시하지 않음

Src   Trgt   ValueA   ValueB  
A    B    1,44    5 
B    A    1,44    5 <-- 
C    D    1,23    8 
D    C    1,23    8 <-- 
F    G    5,12    9 
G    F    5,12    9 <-- 

처럼 보이는 그래서 내가 원하는 스왑 소스와 목표 값하지 다시 할 모든 행을 반환하는 쿼리입니다. 질의해서는 안되는 행은 다른 행과 같은 값 A와 B를 가지고 있지만 소스와 목표 값을 바꿔서 만 위의 테이블에 표시된 것과 같습니다. (위 표에 표시된 것과 같습니다) 따라서 원하는 결과는 다음과 같습니다 :

A    B    1,44    5 
C    D    1,23    8 
F    G    5,12    9 
+0

D/E에는 어떤 변화가 있습니까? –

+0

내 잘못으로 테이블이 업데이트되었습니다. 고마워요 – Chris

답변

1

Src   Trgt   ValueA   ValueB  
나는 이것이 당신이 원하는 생각 :

select t.* 
from t 
where t.src < t.trgt 
union all 
select t.* 
from t 
where t.src > t.trgt and 
     not exists (select 1 
        from t t2 
        where t2.src = t.trgt and t2.trgt = t.src and 
         t2.a = t.a and t2.b = t.b 
       ); 

그것은 처음 두 열 전환 상응하는 행을 필터링, 발생 첫 번째 행을 유지합니다.

편집 :

콤보 당 당신 하나 하나 개 개의 행이 경우 또 다른 방법 :이 (원본 데이터에없는 행을 반환의 위험을 실행

select least(src, trgt) as src, greatest(src, trgt) as trgt, a, b 
from t 
group by least(src, trgt), greatest(src, trgt), a, b; 

행이 중복이없는 경우 가정 trgt > src.

+0

노조 없이는 이렇게 할 방법이 없습니까? 테이블이 광범위한 하위 쿼리로 전환되면 상황이 다소 느려질 것이라고 생각합니다. – Chris

+0

첫 번째 select는 src = trgt (대체 <<= ???) 레코드를 무시하고 "exist"앞에 누락 된 "not"를 삽입하고 a 및 b가 일부 집계 함수로 묶이지 않기 때문에 두 번째 선택이 작동하지 않습니다! 창 함수를 사용하여 다시 작성할 수 있습니다. –

+0

@ChristophG. . . OP는 src와 target이 같을 때 수행 할 작업에 대한 설명이 없습니다. –

1
SELECT * 
FROM ztable zt 
WHERE zt.source < zt.target -- pick only one of the twins 
OR NOT EXISTS(    -- OR :if it is NOT part of a twin 
     SELECT * 
     FROM ztable nx 
     WHERE nx.source = zt.target 
     AND nx.target = zt.source 
     ); 

source=target AR과 행 존재하지 않거나 원하지 않는다.