2012-04-20 7 views
1

は、私はこのような複合キーを持つテーブルがある:複数のキーの行に基づいて2部構成の複合キーの半分を選択するSQL?

========TABLE======== 
key_a_col | key_b_col 

シナリオ:

key_bが「foo」で、と「バー」とそれのためのkey_a下の「バズ」エントリがあります。別のkey_b 'fiz'には 'bar'と 'raz'があります。このよう

私は「バー」とkey_a_colでそれとペア「バズ」の両方があり、すべてのkey_bのエントリを選択したい
========TABLE======== 
key_a_col | key_b_col 
    'bar' | 'foo' 
    'baz' | 'foo' 
    'bar' | 'fiz' 
    'raz' | 'fiz' 

。したがって、 'fiz'は返されません(bar | fooとbaz | fooが存在します)、 'fiz'は(fiz | barのみが一致します)返されます。

どうすればいいですか?

+3

この質問を参照してください。[has-many-throughリレーションシップでSQL結果をフィルタリングする方法](http://stackoverflow.com/questions/7364969/how-to-filter-sql-results-in-a-has -many-through-relation) –

+0

ありがとうypercube。そこの答えは素晴らしいです。 – jeremiahs

答えて

0

ypercubeのリンクは完璧でした。私は少し以上を学んだ。

How to filter SQL results in a has-many-through relation

私はに落ち着い:将来的にこれを読んで誰もがに行くべき私ができるように

SELECT distinct(t.b_id) 
FROM columns_table t 
WHERE EXISTS (SELECT * FROM columns_table 
       WHERE columns_table.id = t.id AND columns_table.col_a = 'bar') 
AND 
EXISTS (SELECT * FROM columns_table 
       WHERE columns_table.id = t.id AND columns_table.col_a = 'baz') 

に見えチェーンWHERE EXISTSは、時間の任意の数を節とまだ良いパフォーマンスを得ます。クエリを複雑にすることなく他のテーブルに参加することもできます。私がypercubeのコメントをアップヴォートすることができたら、私はそうするだろう。

+0

2番目の 'WHERE'を削除します。 –

+0

おっと。完了しました。リンクに感謝します。 – jeremiahs

0

ypercubeはあなたにアイデアを与えてくれるが、それ以上のN条件にしたい場合は、N個の結合をしなければならない。

任意の条件を実行するために使用できるもう1つの方法として、sans joinが挙げられます。テーブルを作成する 'biz'と 'baz'の条件

SELECT DISTINCT col_b FROM Table t1 
     WHERE (SELECT COUNT(*) FROM Table t2 
       INNER JOIN Condition c on t2.key_b = c.condition 
       WHERE t1.key_a = t2.key_a 
       GROUP BY t1.key_a) = 
       (SELECT COUNT(*) FROM CONDITION)