2010-02-28 7 views
3

je la table SQL suivante:Comment supprimer des lignes opposées de la table SQL

A|B 
--- 
w|x 
x|w 
y|z 
z|y 

Puis-je construire une requête qui donnera le résultat suivant:

A|B 
--- 
w|x 
y|z 

Pour résumer, je voudrais traiter les deux colonnes comme un ensemble non ordonné, tel que (a, b) == (b, a).

Répondre

2

Le "meilleur" Code dépend de la base de données, mais qui suit est dbms-agnostique:

SELECT  t.A, 
      t.B 
FROM  my_table t 
LEFT JOIN my_table t2 
     ON t.A = t2.B 
     AND t.B = t2.A 
     AND t.A < t.B 
WHERE  t2.A IS NULL 
+0

+1: J'étais sur le point de modifier ma réponse et d'ajouter celle-ci aussi :) Utilisez 't.A> t.B' pour obtenir les résultats spécifiés (' w | x' au lieu de 'x | w'). –

+0

Merde. J'étais si proche d'avoir ceci, j'ai laissé de côté la comparaison de commande et ainsi mes résultats étaient toujours nuls. – CJH

+0

Je dirais 'w

1

Vous pouvez essayer ce qui suit:

SELECT LEAST(a,b) a, GREATEST(a,b) b 
FROM t 
GROUP BY LEAST(a,b), GREATEST(a,b) 

Avec le test suivant table t:

CREATE TABLE t (a VARCHAR(1), b VARCHAR(1)); 

INSERT INTO t VALUES ('w','x'),('x','w'),('y','z'),('z','y'); 

il retourne:

w x 
y z 

En utilisant LEAST et GREATEST s'assure également que w x est renvoyé au lieu de x w.

+0

Je ne savais pas '' least' et greatest'. Agréable. Est-ce que '' distinct'' ne fonctionnerait pas ici aussi? – Kobi

+0

Oui, 'DISTINCT' retournerait le même dans ce cas. Vous auriez à tester la performance, mais je suppose que ce serait la même chose. –

+0

Très cool. Belle solution. – CJH

Questions connexes