0

私はこれに似たデータベース構造で作業しています: http://dev.mysql.com/doc/employee/en/sakila-structure.html

表:従業員

各従業員に関する情報を含むテーブル。

+---------+----------+
| emp_no* | emp_name |
+---------+----------+
| emp1    | John     |
| emp2    | Mike     |
| emp3    | Rob      |
| emp4    | Kim      |
+---------+----------+

表:部門

会社の部門に関する情報を含むテーブル。

+----------+-----------+
| dept_no* | dept_name |
+----------+-----------+
|       1  | Dep 1     |
|       2  | Dep 2     |
|       3  | Dep 3     |
|       4  | Dep 4     |
|       5  | Dep 5     |
+----------+-----------+

ジャンクション テーブル: emp_dept

主キー: [ emp_no , from_date ]

従業員が以前に働いていた、または現在働いている部門を追跡するためのテーブル。

+---------+----------+------------+------------+
| emp_no* | dept_no  | from_date* |  to_date   |
+---------+----------+------------+------------+
| emp1    |        1 | 2010-01-01 | 2010-12-31 |
| emp2    |        2 | 2010-01-01 | 2013-10-31 |
| emp1    |        4 | 2010-12-31 | 2012-06-14 |
| emp3    |        3 | 2010-01-01 | 2011-08-14 |
| emp4    |        1 | 2010-01-01 | 2014-11-14 |
| emp2    |        5 | 2013-10-31 | 2014-11-14 |
| emp1    |        3 | 2012-06-14 | 2014-11-17 |
| emp3    |        1 | 2011-08-14 | 2013-07-20 |
| emp3    |        4 | 2013-07-20 | 2014-11-14 |
+---------+----------+------------+------------+

期待される表:

各従業員の最新レコードのみをジャンクション テーブル(emp_dept) から従業員テーブルに結合し、以下のようなテーブルを取得するにはどうすればよいですか?

+---------+----------+--------+
| emp_no* | emp_name | dep_no |
+---------+----------+--------+
| emp1    | John     |      3 |
| emp2    | Mike     |      5 |
| emp3    | Rob      |      4 |
| emp4    | Kim      |      1 |
+---------+----------+--------+
4

3 に答える 3

0

サブクエリで最大の日付を取得して結合できます。

emp_dept テーブル エントリにタイプミスがあるようです。emp_no が employees テーブルと一致しません。

従業員が現在部門で働いている場合、to_date は NULL になりますか?

このような場合、サブクエリで処理する必要があります。

SELECT e.emp_no, e.emp_name, ED.dept_no
FROM 
(
   SELECT emp_no, max(to_date) as maxDate
   FROM emp_dept 
   group by emp_no)T
JOIN employee e
ON T.emp_no = e.emp_no
JOIN emp_dept ED
on T.maxDate = ED.t_date
AND ED.emp_no = T.emp_no
于 2014-11-17T18:19:10.667 に答える
0

各従業員の最後の部門のみを提供するクエリを作成し、それを JOIN または CROSS APPLY のメイン クエリに追加します。

... tables with joins etc ...
CROSS APPLY
(
   SELECT TOP 1 employee , dept_no FROM emp_dept 
   WHERE employee = !EMP FROM MAIN TABLE!
   ORDER BY to_date DESC
) AS last_dept 

!EMP FROM MAIN TABLE! 前の表からの従業員の値ですCROSS APPLY (より完全な回答については、これまでの完全なクエリを投稿してください)

于 2014-11-17T18:19:19.080 に答える
0

と仮定するemp_dept.Emp_noと、employees.Emp_no

Select * from 
employees e
join emp_dept ed on e.emp_no = ed.emp_no 
                    and from_date = (Select Max(from_date) 
                       from emp_dept ed2 where ed2.emp_no = e.emp_no)
于 2014-11-17T18:20:38.760 に答える