【问题标题】:SQL select from header table where detail table rows have multiple valuesSQL select from header table where detail table rows has multiple values
【发布时间】:2014-10-26 04:56:13
【问题描述】:

我正在尝试组合查询以获取报告数据。

我不是 SQL 的新手,但我承认我真的只很少使用它。我有一小袋花样,我设法让它走得很远。

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

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

我有 2 张桌子:employee-headeremployee-details

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

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

详细信息表包含每个员工的多行,每行代表该员工获得的training-type 的记录。每一行都引用了表头中员工的id

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

我想让我感到困惑的是可以有任意数量的训练类型,所以不是每个训练类型都有自己的列,而是有自己的行。

我试图让我的问题尽可能清晰,并将其简化到可以实现的程度......事实上,它实际上是一个更复杂的预先存在的查询的一部分,它还执行多个日期操作在详细信息行中查看培训是否有效、已过期或已存档(过期后已重新获得的培训项目)。如果需要,我很乐意提供任何可以提供帮助的更多信息。

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

编辑:

为了让我的问题更清楚,这里有一些示例数据来说明这种情况。

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,在所有具有“叉车”和“焊接”training-type 的员工中,我的查询需要是什么。

【问题讨论】:

  • 如果 multiple 表示 超过 1,请将 GROUP BY id ... HAVING COUNT(training_id) > 1 放入您的子查询中。

标签: mysql sql database select


【解决方案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)

【讨论】:

  • 感谢您的回答,虽然我不确定这是否是我正在寻找的,但我不只是在寻找多行(计数),而是在寻找多行其中一个字段的特定值...在我的问题中添加了一些示例数据更清楚地说明了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2011-10-07
相关资源
最近更新 更多