在子查询条件下连接两个表的问题
Problem with joining two tables on subquery condition
我有 2 个表:
1) et_pics - 这里是关于员工的信息:
- ob_no,整数,键,例如2020
- c_name,varchar,例如运球手 D.E.
e_post,varchar,例如主席
SELECT * 来自 et_pics:
ob_no | c_name | e_post
2020 | Dribbler D.E. | Chairman
2) et_vacations – 这里存储了有关假期的信息:
- ob_no,整数,例如666 e_pic,整数,与 pic.ob_no 的连接,例如2020
- c_name,varchar,例如假期啦啦啦
- e_dateFrom,日期,例如2010-08-08 00:00:00.000
e_dateTo,日期,例如 2010-08-09 00:00:00.000
SELECT * FROM et_vacations vac returns
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,条件是:
- 每个人可能只有一个假期记录(在我看来
最大(e_dateTo));
- 休假记录必须 >= getDate() 否则为空
显示。
无法理解如何编写正确的子查询 – 尝试过这种方式,但没有运气:
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;
我有 2 个表:
1) et_pics - 这里是关于员工的信息:
- ob_no,整数,键,例如2020
- c_name,varchar,例如运球手 D.E.
e_post,varchar,例如主席
SELECT * 来自 et_pics:
ob_no | c_name | e_post
2020 | Dribbler D.E. | Chairman
2) et_vacations – 这里存储了有关假期的信息:
- ob_no,整数,例如666 e_pic,整数,与 pic.ob_no 的连接,例如2020
- c_name,varchar,例如假期啦啦啦
- e_dateFrom,日期,例如2010-08-08 00:00:00.000
e_dateTo,日期,例如 2010-08-09 00:00:00.000
SELECT * FROM et_vacations vac returns
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,条件是:
- 每个人可能只有一个假期记录(在我看来 最大(e_dateTo));
- 休假记录必须 >= getDate() 否则为空 显示。
无法理解如何编写正确的子查询 – 尝试过这种方式,但没有运气:
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;