在子查询条件下连接两个表的问题

Problem with joining two tables on subquery condition

我有 2 个表:

1) et_pics - 这里是关于员工的信息:

ob_no | c_name | e_post

2020 | Dribbler D.E. | Chairman

2) et_vacations – 这里存储了有关假期的信息:

ob_no | e_pic |c_name | e_dateFrom |e_dateTo
| 777 | 2020 |Vacation blah blah |2010-08-08 00:00:00.000 | 2010-08-09 00:00:00.000 |

777 | 2020 |Vacation blah blah |2015-08-08 00:00:00.000 | 2015-08-09 00:00:00.000 |

我需要做的是将et_vacations连接到et_pics,条件是:

无法理解如何编写正确的子查询 – 尝试过这种方式,但没有运气:

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;

我认为您的问题需要更多定义您感兴趣的假期日期(开始日期?结束日期?),但这里是一个开始。请注意,由于您拥有它,所以我将连接留给了除法,但是您没有在任何 select 字段或 where 子句中使用 table 中的数据。除非它被用来减少查询中的人数,因为不是 et_pics 中的每个人都在 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;

我自己用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

我猜你需要输出计划假期最近的员工(?)。然后你应该 JOIN 已经准备好 et_vacations table 使用 LEFT JOIN 以防某些员工的假期记录为空:

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