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 的链接应该给你一个想法,但如果你想比 N 个条件更进一步,你必须做 N 个连接。

这是另一种方法,您可以使用它来执行无连接的任意条件。使用您的 '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)
于 2012-04-20T00:56:03.883 回答
0

ypercube 的链接非常完美。我学到了一点点。任何将来阅读本文的人都应该去:

如何过滤 SQL 结果中的 has-many-through 关系

我决定:

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 回答