Sql 为每个寄存器选择最大日期,如果不存在,则为空
我有以下表格:员工(id、姓名、编号)、配置(id、年份、执照日)、期间(id、开始日期、结束日期、配置id、员工id、期间类型): 我想要这个结果:Sql 为每个寄存器选择最大日期,如果不存在,则为空,sql,oracle,Sql,Oracle,我有以下表格:员工(id、姓名、编号)、配置(id、年份、执照日)、期间(id、开始日期、结束日期、配置id、员工id、期间类型): 我想要这个结果: Result: employee_id years licence_days max(end_date) 1 1 8 2021-05-31 1 3 16 null 1 5 24
Result:
employee_id years licence_days max(end_date)
1 1 8 2021-05-31
1 3 16 null
1 5 24 null
2 1 8 2021-06-01
2 3 16 2021-05-21
2 5 24 null
3 1 8 null
3 3 16 null
3 5 24 null
4 1 8 null
4 3 16 2021-01-17
4 5 24 null
i、 例如,我想选择所有配置的所有员工,并且对于其中的每一个员工,“休假”类型的最大结束日期(如果不存在,则为null)
我如何做到这一点Oracle支持交叉联接,对吗?那么可能是这样的吗
选择e.员工id、c.年、c.执照天数、最大(p.结束日期)
来自雇员e
交叉连接配置c
左连接周期
在e.employee\u id=p.employee\u id上
c.configuration\u id=p.configuration\u id
按e.员工id、c.年、c.执照天数分组
按e.employee_id订购,c.年
Oracle支持交叉联接,对吗?那么可能是这样的吗
选择e.员工id、c.年、c.执照天数、最大(p.结束日期)
来自雇员e
交叉连接配置c
左连接周期
在e.employee\u id=p.employee\u id上
c.configuration\u id=p.configuration\u id
按e.员工id、c.年、c.执照天数分组
按e.employee_id订购,c.年
@umberto-petrov使用ANSI交叉连接
语法明智地选择笛卡尔连接。但是,即使在没有员工的情况下,您需要配置输出的可能性也很小,您可以选择以下方式:
编辑:过滤期间
按照评论中的要求加入“vaccation”。
如果必须筛选某些员工id,请通过(id1,id2,…)中employee.id上的更改1=1上的
。它仍然保留所有配置,但只接收与ID匹配的员工
选择Employee.Employee\u id,
年,
配置许可证日,
最大(配置结束日期)最大结束日期
从配置左侧加入1=1的员工
Periods.configuration\u id=configuration.id上的左连接时段
和Periods.employee_id=employee.id
和Periods.period_type='vaccation'
按员工分组。员工id,
年,
配置许可证天数
按员工下单。员工id,
年,
配置许可证天数
我们从配置开始,至少从这条记录中获取每一条记录,然后与Employee进行左笛卡尔连接
,最后对这两条记录进行完整的让连接
。这样,如果没有员工,这将输出配置id和空值(年、许可证天数和最大结束日期)。@umberto-petrov使用ANSI交叉联接
语法为笛卡尔联接做出明智选择。但是,即使在没有员工的情况下,您需要配置输出的可能性也很小,您可以选择以下方式:
编辑:过滤期间
按照评论中的要求加入“vaccation”。
如果必须筛选某些员工id,请通过(id1,id2,…)中employee.id上的更改1=1上的
。它仍然保留所有配置,但只接收与ID匹配的员工
选择Employee.Employee\u id,
年,
配置许可证日,
最大(配置结束日期)最大结束日期
从配置左侧加入1=1的员工
Periods.configuration\u id=configuration.id上的左连接时段
和Periods.employee_id=employee.id
和Periods.period_type='vaccation'
按员工分组。员工id,
年,
配置许可证天数
按员工下单。员工id,
年,
配置许可证天数
我们从配置开始,至少从这条记录中获取每一条记录,然后与Employee进行左笛卡尔连接
,最后对这两条记录进行完整的让连接
。这样,如果没有员工,这将输出配置id和空值(年、许可证天数和最长结束日期)。我添加了一个非常重要的信息。我的“where”子句必须是period type=vaccation,因为我有另一个对我来说无关紧要的期间类型,有时我必须能够根据员工id进行筛选。@aseolin Edit done。我建议您将翁贝托·彼得罗夫的回答标记为已接受,因为它是第一个,应该符合您的初始需求(“无员工”)“当时的情况是相当出人意料的。再次感谢!我补充了一个非常重要的信息。我的“where”子句必须是period type=vaccation,因为我有另一个对我来说无关紧要的期间类型,有时我必须能够根据员工id进行筛选。@aseolin Edit done。我建议您将翁贝托·彼得罗夫的回答标记为已接受,因为它是第一个,应该符合您的初始需求(“无员工”)“当时的情况是相当出人意料的。再次感谢!
Result:
employee_id years licence_days max(end_date)
1 1 8 2021-05-31
1 3 16 null
1 5 24 null
2 1 8 2021-06-01
2 3 16 2021-05-21
2 5 24 null
3 1 8 null
3 3 16 null
3 5 24 null
4 1 8 null
4 3 16 2021-01-17
4 5 24 null