如何查询另一个查询结果?

时间:2011-03-18 04:42:34

标签: sql

我遇到了问题,因为我对查询不太满意。

我有一个包含两个选择查询的联合的查询:

   SELECT em.emp_code,  
          em.emp_name,  
          COALESCE(SUM(pe.hours_allotted),0) AS hours,  
          pe.dated 
     FROM employee_master em
LEFT JOIN project_employee pe ON (pe.Emp_code = em.emp_code)
    WHERE (dated >= '2011-03-14'
      AND dated < '2011-03-20' ) 
       OR dated IS NULL 
 GROUP BY em.emp_code 
UNION
  (SELECT em.emp_code,
          em.emp_name,
          '0' AS hours,
          pe.dated
     FROM employee_master em
LEFT JOIN project_employee pe ON (pe.Emp_code = em.emp_code)
    WHERE (dated >= '2011-03-14'
      AND dated < '2011-03-20' ) 
       OR dated IS NOT NULL 
 GROUP BY em.Emp_code)
ORDER BY emp_name;

现在结果集返回例如:

ecode  ename    hours 
----------------------
201   Alak basu  10 
201 alak basu    0

第一个结果来自union的第一个select语句,其中hours = 10 and hours = 0来自第二个联合声明。

我想要的是:

ecode     ename       hours 
----------------------------
201      alak basu     10

在这种情况下,每个ecode应该只有一个结果。如何将它组合起来就像用ecode总结小组一样,这样它只给我一个上面的结果?

2 个答案:

答案 0 :(得分:2)

如果所需的结果是将单个员工代码的所有小时数合并为一行,而UNION之后的第二个查询只返回零小时,那么这里的最佳解决方案似乎就是获得摆脱UNION

编辑:进一步说明之后,我认为SQL应该是这样的:

SELECT em.emp_code,
       em.emp_name,
       COALESCE(pe.hours, 0) AS hours
FROM employee_master em
LEFT JOIN (
    SELECT emp_code,
           SUM(hours_allotted) AS hours
    FROM project_employee
    WHERE dated >= '2011-03-14' AND
          dated < '2011-03-20'
    GROUP BY emp_code
    ) pe ON (pe.emp_code = em.emp_code)
ORDER BY em.emp_name;

它正在做什么:

  1. 执行子查询以将所有project_employee条目过滤到指定日期范围内的条目。 (请注意,这里根本不需要进行NULLNOT NULL检查。日期在范围内,或者不是。)
  2. 汇总子查询中生成的每个员工代码的小时数。
  3. 获取employee_master表中的所有员工,并在筛选的求和project_employee子查询结果集中搜索匹配的条目。 (因为它是LEFT JOIN,即使没有过滤的project_employee条目匹配,主表中的每个员工都会有一个条目。)
  4. 如果没有匹配,pe.hours列将为NULL,导致COALESCE恢复为第二个零值。
  5. emp_name订购结果。

答案 1 :(得分:2)

您可以随时执行以下操作:

select emp_code, min(emp_name) as emp_name, sum(hours)
from (
  <your original query here>
) as e
group by emp_code
order by emp_name;