加入两个表,但选择要求所有辅助列相同

时间:2014-06-04 13:20:47

标签: mysql sql

我正在尝试仅在表选择中的所有列对第二个表中的给定键具有相同值时才输出select语句。

以下是示例:

下面的“规则”表格对应每个规则都具有相同的值(名称,年龄)。但是,“状态”值会随“规则”表中的每一行(True / False)而变化。

我希望能够从表'Rule'中选择,其中表'Hash'中的ruleid等于表'Rule'中的'ruleid',并且只有当所有选中的'state'时才写入输出来自'Hash'的'ruleid'的值等于'Hash'表中该ruleid的'state'值。

以下是示例输出的样子:

ruleid    name    age  col2
27488     Bob     99    xx              // output because all the rows In Table Rule with ruleid=27488 have state=False
27455     Sue     23    xx              // output because all the rows in Table Rule with ruleid=27455 have state=True
27444     Tim     34    xx              // output because all the rows in Table Rule with ruleid=27444 have state=False

下面的示例表'Hash'有一行,其中ruleid 27460有state ='True'。表'Rule'(下面)的行包含相同的'ruleid'和'state'值,除了一行 - 因此没有输出。 如果'ruleid'的'Rule'中的所有行与Hash中的'state'具有相同的值,则输出应该是该'ruleid'行的一行。

哈希

+-------------+--------------+------------+-------+
| ruleid      | state        | colx       | col2  | 
+-------------+--------------+------------+-------+
| 27488       | False        | XXX        | XX    |
| 27455       | True         | XXX        | XX    |
| 27460       | True         | XXX        | XX    |
| 27444       | False        | XXX        | XX    |
+-------------+--------------+------------+-------+

规则

+-------------+--------------+------------+-------+
| ruleid      | state        | name       | age   | 
+-------------+--------------+------------+-------+
| 27488       | False        | Bob        | 99    |
| 27488       | False        | Bob        | 99    |
| 27460       | True         | Randy      | 11    |
| 27460       | True         | Randy      | 11    |
| 27460       | False        | Randy      | 11    |
| 27455       | True         | Sue        | 23    |
| 27455       | True         | Sue        | 23    |
| 27455       | True         | Sue        | 23    |
| 27444       | False        | Tim        | 34    |
| 27444       | False        | Tim        | 34    |
| 27444       | False        | Tim        | 34    |
| 27444       | False        | Tim        | 34    |
+-------------+--------------+------------+-------+

1 个答案:

答案 0 :(得分:2)

select distinct r.ruleid,
                r.name,
                r.age,
                h.col2 
from hash h
join rule r on r.ruleId = h.ruleId
where not exists
( 
select 1 
from rule rr 
where rr.ruleId = h.ruleId
  and rr.state <>  h.state
)