0

我正在尝试将数据合并到两个表中。第一个(子)表包含一些付款信息,包括生效日期、员工编号和付款值。

emp_no  date_earn   Amount
456789  03/10/2009  20
456789  18/03/2010  30
456789  17/03/2011  12
456789  16/03/2012  34

另一个(主)表包含员工编号、生效日期和职位。

emp_no  effective_date  job_title 
456789  01/01/2009      Tester
456789  20/05/2010      Manager
456789  01/04/2011      Snr Manager

我需要报告薪酬信息表并显示在薪酬信息生效日期时的职位名称:

emp_no  date_earn   Amount  job_title 
456789  03/10/2009  20      Tester
456789  18/03/2010  30      Manager
456789  17/03/2011  12      Manager
456789  16/03/2012  34      Snr Manager

我尝试过使用相关查询,例如:

select p.emp_no, p.date_earn, p.amount,
(select top 1 e.job_title from emp_hist e
where e.emp_no = p.emp_no
and e.effective_date <= p.date_earn ) as JOB_TITLE
from 
pay p where p.emp_no = 456789

但根据上面的例子,我会给我所有行的工作测试员。如果有人可以提供帮助,我将不胜感激。非常感谢。

4

1 回答 1

1

您需要在 emp_hist 中的 SELECT 中使用 ORDER BY - 否则第一条记录“Tester”始终满足您的条件并首先返回。

where e.emp_no = p.emp_no and e.effective_date <= p.date_earn order by e.effective_date desc

但是,在这种情况下,我相信 CROSS APPLY 查询可以成为您的朋友。一旦你掌握了它的用法,你就会发现自己一次又一次地使用它。一个好的经验法则是,如果您正在考虑在内联视图中使用 SELECT TOP * - 请停止并改用 APPLY 查询。恕我直言,它使您的 SQL 更易于阅读和理解,我敢说它使您的查询更有效。

您可以使用 CROSS APPLY 重新编写查询,如下所示:

SELECT
   P.emp_no
  ,P.date_earn
  ,P.amount
  ,T.job_title
FROM
  pay P
  CROSS APPLY (
    SELECT TOP 1
      E.job_title
    FROM
      emp_hist E
    WHERE
      E.emp_no = P.emp_no
      AND E.effective_date <= P.date_earn
    ORDER BY
      E.effective_date DESC
  ) T
WHERE
  P.emp_no = 456789

我没有运行它,但我相信它应该可以工作。

于 2012-08-21T14:01:21.213 回答