2017-10-09 6 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が別の行と同じで、ソース値とターゲット値が入れ替えられたものだけです(上の表にマークされているもの) したがって、望ましい結果は次のようになります。

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

D/Eはどうなりましたか? –

+0

My fault、テーブルを更新しました。ありがとう – Chris

答えて

1

私は、これはあなたが欲しいものだと思う:

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

それは最初の2つの列を切り替える同等の行をフィルタリング、遭遇した最初の行を保持します。

EDIT:

コンボごとにあなただけの1つの1行がある場合は別のアプローチ:これは、(元のデータではない行を返すのリスクを実行します

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

source=target ARでその行を想定し
+0

組合なしでこれを行う方法はありませんか?テーブルtが広範なサブクエリで切り替えられる場合、私は物事がかなり遅いと思う。 – Chris

+0

最初に選択すると、src = trgt(<?

+0

。 。 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 
     ); 

存在しないか、望ましくない。

関連する問題