2016-02-10 56 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