繁体   English   中英

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

[英]Problem with joining two tables on subquery condition

我有2张桌子:

1)et_pics-有关员工的信息:

  • ob_no,int,key,例如2020
  • c_name,varchar,例如Dribbler DE
  • e_post,varchar,例如董事长

    SELECT * FROM et_pics:

ob_no | c_name | e_post

2020 | 盘带机DE | 主席

2)et_vacations –在此存储有关假期的信息:

  • ob_no,int,例如666 e_pic,int,连接到pic.ob_no,例如2020
  • c_name,varchar,例如Vacation等等等等
  • e_dateFrom,日期,例如2010-08-08 00:00:00.000
  • e_dateTo,日期,例如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:

  • 每人可能只有一份假期记录(在我看来max(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;

我相信您的问题需要围绕您感兴趣的休假日期(开始日期?,结束日期?)进行更多的定义,但这是一个开始。 注意,由于您拥有联接,所以我离开了联接,但是您未在任何选择字段或where子句中使用该表中的数据。 除非因为不是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;

我想您需要输出计划休假最近的员工(?)。 然后,如果某些员工的休假记录为空,则应该使用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演示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM