2016-02-10 57 views
1

連接兩個表我有2個表:Proble與子查詢條件

1)et_pics - 關於僱員這裏信息:

  • ob_no,INT,鍵,例如2020
  • c_name,varchar,例如運球者D.E.
  • e_post,varchar,例如,主席

    SELECT * FROM et_pics:

ob_no | c_name | e_post

2020 |運球者D.E. |主席

2)et_vacations - 在這裏考慮假期的信息存儲:

  • ob_no,INT,例如666 e_pic,int,與pic.ob_no的連接,例如2020
  • c_name,varchar,例如假期等等
  • e_date從日期,例如, 2010-08-08 00:00:00.000
  • e_dateTo,日期,e.g 2010-08-09 00:00:00.000

    SELECT * FROM et_vacations VAC回報

ob_no | e_pic | c_name | e_dateFrom | e_dateTo
| 777 | 2020 |假期等等| 2010-08-08 00:00:00.000 | 2010-08-09 00:00:00.000 |

777 | 2020 |假期等等| 2015-08-08 00:00:00.000 | 2015-08-09 00:00:00.000 |

我需要做的是連接et_vacations與條件et_pics:

  • 的可能只有一個每人休假記錄(在我看來,最大 (e_dateTo));
  • 假期記錄必須> = getDate()或null顯示爲 。

無法瞭解如何編寫正確的子查詢 - 試圖以這種方式,但沒有運氣:

SELECT 
    pics.c_name, 
    pics.e_post, 
vac.e_dateTo 
FROM et_pics pics 
INNER JOIN et_division div on pics.e_division = div.ob_no 
INNER JOIN et_vacations vac on vac.e_pic = pics.ob_no 
WHERE 
    (pics.e_fireDate IS NULL OR pics.e_fireDate > getDate()) 
    AND vac.e_dateTo IN (
    SELECT MAX(vac.e_pic) from et_vacations vac 
    GROUP BY vac.e_pic 
    ) 
    ORDER BY pics.c_name; 

在此先感謝您的幫助來解決這個問題。

+0

我沒有完全理解..你可以張貼預期結果的樣本? – sagi

+0

這是一個開始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/或者你可以在sqlfiddle.com上張貼表格和樣本數據 –

+0

什麼是「沒有運氣「的意思?你得到的結果有什麼問題? –

回答

1

我相信你的問題需要圍繞什麼被認爲是假期的日期(開始日期?,結束日期?)你有興趣,但這裏是一個開始。請注意,由於您已經擁有它,因此我將該聯接留給了部門,但您並未在該表中的任何選擇字段或子句中使用該數據。除非它被用來減少查詢中的人數,因爲不是每個人都在et_division中,那麼這個連接應該被刪除。

SELECT 
    pics.c_name, 
    pics.e_post, 
vac.e_dateTo 
FROM et_pics pics 
INNER JOIN et_division div on pics.e_division = div.ob_no 
INNER JOIN(select e_pic, max(e_dateTo) from et_vacations group by e_pic)vac on vac.e_pic = pics.ob_no 
WHERE 
    (pics.e_fireDate IS NULL OR pics.e_fireDate > getDate()) 
     ORDER BY pics.c_name; 
0

我soleved通過自己與CTE,但HLGEM是弗里斯特:

;WITH Vacations_nah AS 
(
    SELECT 
     vac.e_pic, 
     MAX(vac.e_dateTo) AS e_dateTo_2 
    FROM et_vacations vac 
    WHERE e_dateTo >=getDate() 
    GROUP BY vac.e_pic 
) 
SELECT 
    pics.c_name, 
    pics.e_post, 
    e_dateTo_2 
FROM et_pics pics 
    INNER JOIN et_division div on pics.e_division = div.ob_no 
    LEFT JOIN Vacations_nah nah on nah.e_pic = pics.ob_no 
WHERE 
    (pics.e_fireDate IS NULL OR pics.e_fireDate > getDate()) 
    AND pics.c_visible=1 
1

我想你需要輸出員工最近刨假期(?)。然後,你應該加入已經使用LEFT在空度假記錄情況JOIN一些員工準備et_vacations表:

WITH T_vac as 
(
    select et_vacations.*, 
    ROW_NUMBER() OVER (PARTITION BY e_pic ORDER BY e_dateTo) as RowNum 
    from et_vacations 
    where e_dateTo>=getDate() 
) 
SELECT 
    pics.c_name, 
    pics.e_post, 
    vac. e_dateFrom, 
    vac.e_dateTo 
FROM et_pics pics 
LEFT JOIN T_vac vac on (vac.e_pic = pics.ob_no) AND (vac.RowNum=1) 
    ORDER BY pics.c_name; 

SQLFiddle demo