2017-10-09 12 views
0

Je souhaite interroger une table de base de données contenant des lignes ayant des valeurs inverses par rapport aux autres lignes. Ainsi, la table ressemble à ceciSuppression de lignes avec des valeurs inverses/permutées

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

Ce que je veux est une requête qui renvoie toutes les lignes qui ne sont pas encore à la source et la valeur cible permutés. Les lignes qui ne devraient pas être interrogées sont celles qui ont la même valeur A et B comme une autre ligne, mais seulement avec la source et la valeur cible permutées (celles marquées dans le tableau ci-dessus) Ainsi, les résultats souhaités ressembleraient à ceci:

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

Qu'est-il arrivé à D/E? –

+0

Ma faute, mis à jour la table. Merci – Chris

Répondre

1

Je pense que c'est ce que vous voulez:

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

Il conserve la première ligne rencontrée, filtrage des lignes équivalentes où les deux premières colonnes sont commutées.

EDIT:

Une autre approche si vous venez d'une seule ligne par combo est:

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; 

Ce court le risque de retourner une ligne pas dans les données d'origine (si la ligne n'a pas double et trgt > src.

+0

N'y a-t-il aucun moyen de le faire sans syndicat? Si la table t était remplacée par une sous-requête étendue, je pense que les choses seraient plutôt lentes. – Chris

+0

La première sélection ignore les enregistrements avec src = trgt (remplace

+0

@ChristophG. . . Le PO ne fait aucune déclaration sur ce qu'il faut faire lorsque le src et la cible sont égaux. –

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

en supposant que les lignes avec source=target ar e pas présent ou pas voulu.