1

我有这样的表“人”

  id  |  firstName  |  lastName  |  ...
-----------------------------------------
  1   | Bill        | Gates      |
  2   | Steve       | Jobs       |
  3   | Linus       | Torvalds   |

第二张桌子像这样“美德”

  id  | person_id | v_key    | v_value
---------------------------------------------
  1   | 1         | OS       | Windows Mobile
  2   | 1         | Company  | Microsoft
  3   | 2         | OS       | iOS
  4   | 2         | Company  | Apple

我可以为所有这样的人计算美德

select a.firstName, a.lastName, count(b.v_key)
  from person a
  left join virtue b on b.person_id = a.id
  group by a.firstName, a.lastName

现在我需要从第一个表中选择所有给出“OS”=“iOS”、“Company”=“Apple”等美德列表的人。

4

2 回答 2

1

如果您需要获取具有您给予的所有美德的人,那么您可以使用group by并过滤count

with cte_given_list as (
    select *
    from (values ('OS', 'iOS'), ('Company', 'Apple')) as c(v_key, v_value)
)
select
    p.firstName, p.lastName
from cte_given_list as c
    inner join virtue as v on v.v_key = c.v_key and v.v_value = c.v_value
    inner join person as p on p.id = v.person_id
group by p.id
having count(*) = (select count(*) from cte_given_list as t)

请注意,这里我按 id 分组,但选择名称。如果 id 是 person 表中的主键,则在 PostgreSQL 中是可能的。

sql fiddle demo

于 2013-10-21T05:37:55.740 回答
0

如果我没看错,唯一的额外标准是 OS=IOS 和 Company=Apple,而您对其他选项不感兴趣。在这种情况下,你可以使用这样的东西:

选择 a.firstName, a.lastName from person a
left join d on b.person_id = a.id AND (b.v_key = 'OS' AND b.v_value = 'iOS') OR (b.v_key = 'Company' AND b.v_value = 'Apple') 按 a.firstName、a.lastName 分组

如果您需要按操作系统或按公司提取它们,您可以考虑将它们作为参数提供。

那是你要找的吗?

于 2013-10-21T05:24:07.253 回答