0

2つのテーブルのデータを結合しようとしています。最初の(子)テーブルには、発効日、従業員番号、および支払い額を含むいくつかの支払い情報が含まれています。

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

もう1つの(マスター)テーブルには、従業員番号、発効日、役職が含まれています。

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にORDERBYが必要です。そうでない場合、最初のレコード「Tester」は常に条件を満たし、最初に返されます。

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

ただし、この場合、CROSSAPPLYクエリが友だちになると思います。その使用法をマスターすると、何度も何度もそれを使用していることに気付くでしょう。経験則として、インラインビューでSELECT TOP *を使用することを検討している場合は、代わりにAPPLYクエリを停止して使用してください。私見では、SQLがはるかに読みやすく、理解しやすくなっています。クエリがより効率的になることを思い切って考えます。

次のように、CROSSAPPLYを使用してクエリを書き直すことができます。

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 に答える