2011-04-20 15 views
1

Supposons que nous avons une table:requête Sql pour comparer les lignes

id1 id2 
1 2 
2 1 
3 4 
4 3 

Le résultat attendu est

id1 id2 
1 2 
3 4 

lignes 1,2 et 2,1 sont identiques, et un seul doit être sorti. Quelle est la requête SQL pour cela.

+0

Quels 'RDBMS' utilisez-vous? – Quassnoi

+0

J'utilise Oracle 10g. –

Répondre

4

En supposant que votre RDBMS prend en charge LEAST et GREATEST (Oracle fait):

SELECT DISTINCT LEAST(id1, id2), GREATEST(id1, id2) 
FROM mytable 

Version multi-plateforme:

SELECT DISTINCT 
     CASE WHEN id1 < id2 THEN id1 ELSE id2 END, 
     CASE WHEN id1 > id2 THEN id1 ELSE id2 END 
FROM mytable 
0
Select ... 
From MyTable As T 
Where Exists (
       Select 1 
       From MyTable As T2 
       Where T2.id1 = T.id2 
        And T2.id2 = T.id1 
       ) 
    And T.id1 < T.id2  

Une autre solution à l'aide de l'Union

Select T.id1, T.id2 
From MyTable As T 
Where T.id1 <= T.id2 
Union 
Select T.id2, T.id1 
From MyTable As T 
Where T.id1 > T.id2 
0

Mon interprétation de ce que vous essayez de faire est: les lignes de retour étaient id1 correspond à id2 et id2 correspond à id1, mais ne retournent que des lignes de cet ensemble lorsque id1 est aussi inférieur ou égal à id2.

select x.id1, x.id2 from myTable x, myTable y where x.id1 = y.id2 and y.id1 = x.id2 and x.id1 <= y.id1

0

même question j'ai eu aussi de résoudre récemment. Voir Eliminating duplicates.

select id1, id2 
from t 
where not exists (
    select 1 
    from t 
    where id1 = t.id2 
    and id2 = t.id1 
    and rowid > t.rowid 
); 
Questions connexes