1

次のような複合キーを持つテーブルがあります。

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

シナリオ:

key_bは「foo」であり、key_aの下に「bar」および「baz」エントリがあります。別のkey_b'fiz'には'bar'と'raz'があります。

このような:

========TABLE========
key_a_col | key_b_col
    'bar' | 'foo'
    'baz' | 'foo'
    'bar' | 'fiz'
    'raz' | 'fiz'

key_a_colに「bar」と「baz」の両方がペアになっているすべてのkey_bエントリを選択したいと思います。したがって、「foo」は返されますが(bar|fooとbaz|fooが存在します)、「fiz」は返されません(fiz | barのみが一致します)。

どうすればこれを実現できますか?

4

2 に答える 2

0

ypercubeのリンクは完璧でした。私は少し以上を学びました。将来これを読む人は誰でもに行くべきです:

SQLの結果をフィルタリングする方法は、多くのスルー関係になります

私は落ち着きました:

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のコメントに賛成できれば、賛成です。

于 2012-04-20T04:51:20.793 に答える
0

ypercubeがあなたにアイデアを与えるはずのリンクですが、それよりもさらにNの条件に進みたい場合は、Nの結合を行う必要があります。

結合なしの任意の条件を実行するために使用できる別のアプローチを次に示します。'biz'と'baz'を使用してテーブルConditionsを作成します

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)
于 2012-04-20T00:56:03.883 に答える