2012-02-01 67 views
0

次のことが可能かどうか疑問に思っています。次の表があるとします:SQLクエリ - 異なる条件で同じ列を2回表示する

ID |名前
  1 |ジョン
  2 | Bob
  3 |ジョン
  4 | |

NAME:ボブ


は以下になりクエリを実行することが可能ですID1 | ID2

ジョン      | 1       | 3
ボブ        | 2       | 4

EDIT

混乱させて申し訳ありません。私の質問は、大きなデータセットに対して2つの複製の可能性を処理する必要がある場合に対応しています。

+0

クエリのみを処理するために必要があると言っています2つの重複の可能性、またはあなたの例が2つあるかどうか? – JohnFx

+0

2つの複製の可能性のみを処理する必要があります。 –

答えて

9

は、2つの行がそれぞれの名前と正確に存在する場合、以下は動作するはず

SELECT 
    NAME, 
    MIN(ID) as ID1, 
    MAX(ID) as ID2 
FROM Table t 
GROUP BY NAME 
1

これは動作するはずです。サブクエリは、正確に2つのidを持たないすべての名前を除外します。正確に2と仮定すると

select name,min(id) as id1,max(id) as id2 
from table 
join(
    select name 
    from table 
    group by name 
    having count(1)=2 
)names 
using(name) 
group by name; 
+2

あなたがここに参加する必要があるかどうか確かめないでください。また、自然な結合のために-1に近づいています – JNK

+0

まあ、あなたは結合を行うか、 'where name(count(1)= 2を持つ名前でテーブルグループから名前を選択してください)'に追加することができます。正直なところ、クエリオプティマイザは通常、それを抽象化します。 –

+0

私は彼が全くフィルターをかける必要はないと確信しています。なぜなら彼はそれがなければ同じ値を持つ2つのIDを持っているからです。 – JNK

1

を複製:

SELECT a.name, 
     a.id as id1, 
     b.id as id2 
FROM the_table a 
    JOIN the_table b ON a.name = b.name AND a.id <> b.id 
+0

これはid値が同じかどうかをチェックしないので重複した行を与えます – JNK

+0

多くの結果を返す。 –

+2

@JNK:そうですね、忘れました。 –

関連する問題