SQL从头表中选择,其中详细信息表行具有多个值

时间:2014-09-02 01:37:30

标签: mysql sql database select

我正在尝试整理查询以获取报告的数据。

我不是SQL的新手,但我承认我真的只是非常轻松地使用它。我有一小撮技巧,我设法做了很长的路。

我有一种感觉,这次我可能需要一个嵌套查询来实现我的目标,这是我以前从未尝试过的。

这是我问题的一个极其简化的版本。

我有2个表:employee-headeremployee-details

这些表之间是一对多关系(1个标题到许多细节)

标题包含有关员工的联系信息,每位员工一行,每位员工id - 主键。

详细信息表包含每个员工的多个行,每个行代表员工实现的training-type记录。每行都从标题表中引用员工的id

我的目标是选择员工列表及其培训类型员工有多个training-types ...即员工同时具有training-type-1和traing-type-2

我认为引起我兴奋的是,可以有任意数量的培训类型,因此,不是每种培训类型都有自己的列,而是拥有自己的行。 / p>

我试图让我的问题尽可能清晰,并将其简化到足以让它变得可行......事实是,它实际上是更复杂的预先存在的查询的一部分它还对详细信息行执行多个日期操作,以查看培训是否有效,已过期或已归档(已过期的过期培训项目已到期)。我很乐意提供任何可能有用的信息。

我如何获取满足我需求的结果集?

编辑:

为了使我的问题更清楚,这里有一些说明情况的样本数据。

employee-header表:

emp-id | employee-name
------------------
   1   | Employee A
   2   | Employee B
   3   | Employee C

employee-detail表:

det-id | emp-id | training-type
-------------------------------
   1   |   1    | forklift
   2   |   1    | welding
   3   |   1    | lifting
   4   |   2    | forklift
   5   |   2    | lifting
   6   |   3    | welding
   7   |   3    | forklift

因此,如果我想从标题中选择emp-idemployee-name,那么{&1;}叉车的所有员工都会training-type"和"焊接"我的查询需要什么。

1 个答案:

答案 0 :(得分:1)

这可以通过子查询来实现:

SELECT h.id, h.employee_name, d.training-type
FROM employee-header h INNER JOIN employee-details d ON h.id = d.id
WHERE h.id IN -- here is the sub-query
(SELECT id from employee-details 
 WHERE training-type IN ('forklift','welding') 
 GROUP BY id HAVING COUNT(DISTINCT training-type) = 2)

如果您需要在匹配项上选择确切的数字,可以在选择条件中使用IN子句,然后使用匹配请求值数量的HAVING COUNT(DISTINCT training-type)