Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为每个寄存器选择最大日期,如果不存在,则为空_Sql_Oracle - Fatal编程技术网

Sql 为每个寄存器选择最大日期,如果不存在,则为空

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

我有以下表格:员工(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             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