sql:一次检索多行的信息

时间:2017-12-16 03:35:12

标签: sql database oracle

我想根据一个查询中的值获取行。我知道这可以使用子查询完成,但我想使用单个查询,它将根据给定条件使用一个查询执行和获取详细信息,然后如果详细信息包含一些值,然后详细使用其他值,我想获取细节使用外部查询。

例如: 假设一个员工在财政年度和财政年度可以属于多个部门(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检索员工的所有详细信息。

提前感谢您的帮助。

1 个答案:

答案 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';