2017-01-31 11 views
0

列に値が重複しない行を選択したい。私が意味するのは、| 2 | 1 | | 1 | 2 |現在の選択では、それらのうちの1つだけを表示したい。両方の列に重複がないsqlを選択

+------+------+ 
| id1 | id2 | 
+------+------+ 
| 2 | 1 | 
| 4 | 3 | 
| 3 | 4 | 
| 1 | 4 | 
+------+------+ 

したがって、上記の例では、最初の、最後の、2番目または3番目の行のみを選択します。

これらの値を別の表の文字列 'TITLE'で置き換えることもできます。

テーブル値:

+----+----------+ 
| id | title | 
+----+----------+ 
| 1 | title1 | 
| 2 | title2 | 
| 3 | title3 | 
| 4 | title4 | 
+----+----------+ 

最終選択は、行のタイトルだけを持っているでしょうようにします。

答えて

2

これを行うにはleastgreatestを使用できます。 leastはid1、id2の下位値を取得し、greatestはid1、id2のうち大きい方を取得します。

select distinct least(id1,id2),greatest(id1,id2) 
from t 

実際には、上記の表にない行が生成されます。これを避けるには、派生テーブルを持つleft joinが必要です。

select t1.id1,t1.id2 
from t t1 
left join (select least(id1,id2) as id1,greatest(id1,id2) as id2 
      from t 
      group by least(id1,id2),greatest(id1,id2) 
      having count(*) > 1 
     ) t2 on t2.id1=t1.id1 and t2.id2=t1.id2 
where t2.id1 is null and t2.id2 is null 

編集:に基づいて、異なるテーブルからタイトル文字列を取得するには、IDの

select t1.id1,t1.id2,tt1.title,tt2.title 
from t t1 
left join (select least(id1,id2) as id1,greatest(id1,id2) as id2 
      from t 
      group by least(id1,id2),greatest(id1,id2) 
      having count(*) > 1 
     ) t2 on t2.id1=t1.id1 and t2.id2=t1.id2 
join titles tt1 on tt1.id=t1.id1 --use a left join if the titles table won't have all the id's 
join titles tt2 on tt2.id=t1.id2 --use a left join if the titles table won't have all the id's 
where t2.id1 is null and t2.id2 is null 
+0

うわー、それは本当に助けました。このテーブルの現在の値を別のテーブルに格納されている値に置き換えることもできますか?各IDの文字列値を持つテーブル '値'がある場合、どのように文字列だけを印刷(選択)する必要がありますか? – hvertous

+0

サンプルデータを表示してください。 –

+0

私は2つの列、 'id'と文字列 'Title'を持つ別のテーブル 'values'を持っています。私はOPのポストの選択肢のIDを 'タイトル'に置き換える必要があります。 – hvertous

関連する問題