2016-12-14 13 views
-1

私は2つのテーブル従業員マスタテーブルとタイムシートテーブルを持っています。他のテーブルにないテーブルからレコードを選択する方法

従業員テーブルの構造:

+------------+---------+ 
| emp_number | empname | 
+------------+---------+ 
|   2 | Jagdish | 
|   3 | Sulata | 
|   4 | Prasad | 
|   5 | Vijay | 
|   6 | Armin | 
+------------+---------+ 

そして、タイムシートのテーブルの構造:

+------------+--------+------------+------------+ 
| emp_number | status | startDate | EndDate | 
+------------+--------+------------+------------+ 
|   2 | 0  | 2016-01-01 | 2016-01-07 | 
|   3 | 1  | 2016-02-01 | 2016-02-06 | 
|   4 | 40  | 2016-01-01 | 2016-01-07 | 
|   9 | 0  | 2016-01-06 | 2016-01-12 | 
|   10 | 4  | 2016-01-01 | 2016-01-08 | 
+------------+--------+------------+------------+ 

たちは週でグループを使用して、すべての従業員のレコードを取得するクエリを記述することはできますか?
私にそれを案内してください。ありがとうございました。試しコードの下

+0

非常に単純code.itsの下にこれを試してみてくださいあなたはLEFT JOINを使用してEMP_NUMBER列に2つのテーブルを結合することができ、予想される出力 – Wanderer

+0

を共有してください。 Where句で、emp_numberがNULL条件であることを選択した場合、行が欠落します。 – Eralper

+0

これらのdbmsタグをすべて削除しました。自由にそれらの1つを追加してください。 – jarlh

答えて

0
SELECT * FROM Employee Table 
WHERE NOT EXISTS(SELECT 1 FROM Timesheet WHERE Employee.emp_number = Timesheet 
.emp_number AND Status IN (0,40)) 
0

私は、これは正しいコードであると信じて、あなたの特定の質問

select employee.* 
from employee 
where employee.emp_number not in (select emp_number from timesheet) 
and timesheet.status in (0,40) and timesheet.enddate between '2016-01-01' 
and '2016-01-07' 
0

あたりとして:

SELECT * 
FROM Timesheet INNER JOIN Employee ON Timesheet.emp_number=Employee.emp_number 
WHERE (Employee.status = 0 OR Employee.status = 40) 
    AND (Timesheet.startDate = '2016-01-01' AND Timesheet.EndDate = '2016-01-07') 

あなたが応じてセミコロンの間の日付を変更する必要があります任意のデータ型startDateとEndDateについては、

例:'2016-01-01 00:00:00 '

+0

いいえ動作しません。私は内部結合の代わりに左結合が動作すると思う。しかし、私は余分なステータスと日付条件を追加する場所を得られません。 – Madhura

0

- このコードを試してください。それはだ速く

WITH cte_timesheet AS (
    select employee_id, 
     MAX(CASE WHEN status IN (0,40) THEN 1 ELSE 0 END) include_status 
    from em_timesheet 
    where start_date = '2016-12-05' 
     AND end_date = '2016-12-11' 
    GROUP BY employee_id 
) 
SELECT emp_number, 
     empname 
    FROM em_employee e 
    LEFT JOIN cte_timesheet t ON t.employee_id = e.emp_number 
    WHERE t.employee_id IS NULL 
    OR t.include_status = 1 
0

select * from #emp E 
LEFT JOIN #TimeSheet T ON t.emp_nbr=e.emp_nbr 
where startdate>='2016-01-01' and enddate<='2016-01-07' 
and status_ in(0,40) 
関連する問題