我想根据一个查询中的值获取行。我知道这可以使用子查询完成,但我想使用单个查询,它将根据给定条件使用一个查询执行和获取详细信息,然后如果详细信息包含一些值,然后详细使用其他值,我想获取细节使用外部查询。
例如: 假设一个员工在财政年度和财政年度可以属于多个部门(a,b,c,d等),员工可以属于一个或多个部门。我想检索最近财政年度和属于部门c的所有员工的详细信息。
EMPLOYEE_DEPARTMENTS是一个表,其中包含外键(员工ID和财务年度的组合)和部门ID等信息。 外键类似于123_1718,其中1718表示财务年度,123表示员工ID。如果我们检索属于部门c的员工,那么我想从其他表中检索员工的其他详细信息。
我知道这可以通过编写多个SQL来查找所有财政年度的员工所属部门c,然后为每个员工检查员工是否属于财政年度的部门c,如果不是,则将其从列表中删除。但有没有办法可以编写pl / sql或者我可以一次性检索所有细节的任何东西。
示例:
EMPLOYEE_DEPARTMENTS
————————————————————
ID_EMPFY ID_DEPARTMENT
1 3
2 1
2 2
1 3
4 1
3 2
4 3
4 2
EMPLOYEE
ID NAME ID_DEPARTMENT CITY
DEPARTMENT
ID NAME
1 a
2 b
3 c
EMPLOYEE_FINANCIALYEAR
ID ID_EMPLOYEE FINYEAR
1 123 1718
2 123 1516
3 456 1718
4 234 1718
我必须检索属于c部门和FINYEAR的员工,这可能是员工是公司一部分的最后一个财政年度。对于员工来说,这意味着我必须在公司找到他的最后一年(可以使用表EMPLOYEE_FINANCIALYEAR完成),然后检查去年是否将部门作为c,如果它已经使用了EMPLOYEE_DEPARTMENTS的ID_EMPFY,则从EMPLOYEE_FINANCIALYEAR获得EMPLOYEE_D然后使用ID_EMPLOYEE检索员工的所有详细信息。
提前感谢您的帮助。
答案 0 :(得分:1)
您可以使用此查询:
WITH LAST_EMPLOYEE_FINANCIAL_YEAR AS
(
SELECT *
FROM (SELECT T.*,
ROW_NUMBER() OVER(PARTITION BY T.ID_EMPLOYEE ORDER BY T.FINYEAR DESC) ROW_NUM
FROM EMPLOYEE_FINANCIALYEAR T
)
WHERE ROW_NUM = 1
)
SELECT *
FROM LAST_EMPLOYEE_FINANCIAL_YEAR EF
INNER JOIN EMPLOYEE_DEPARTMENTS ED ON ED.ID_EMPFY = EF.ID
INNER JOIN DEPARTMENT D ON D.ID = ED.ID_DEPARTMENT
AND D.NAME = 'C';