Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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_Database_Oracle - Fatal编程技术网

sql:一次检索多行的信息

sql:一次检索多行的信息,sql,database,oracle,Sql,Database,Oracle,我想根据一个查询中的值获取行。我知道这可以使用子查询完成,但我想使用单个查询,该查询将根据给定条件使用一个查询执行并获取详细信息,然后如果详细信息包含某个值,则使用其他值获取详细信息,我想使用外部查询获取详细信息 例如: 假设一个员工在一个财政年度可以属于多个部门(a、b、c、d等),在一个财政年度,员工可以属于一个或多个部门。我想检索最近一个财政年度所有属于c部门的员工的详细信息 EMPLOYEE_DEPARTMENTS是一个包含外键(员工id和财政年度的组合)和部门id等信息的表。 外键类似

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

例如: 假设一个员工在一个财政年度可以属于多个部门(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部门和财政年度的员工,该财政年度可以是员工参与公司的任何最后一个财政年度。这意味着对于员工,我必须找到他在公司的最后一年(可以使用表employee\u FINANCIALYEAR完成),然后检查去年是否有部门作为c,以及是否有部门从employee\u部门使用ID\u EMPFY,从employee\u FINANCIALYEAR获取员工D,然后使用ID\u employee检索员工的所有详细信息


提前感谢您的帮助。

您可以使用以下查询:

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

听起来你在描述一个内部连接。如果您提供一个简单的示例表以及希望从查询中获得的输出,这可能会有所帮助。感谢您成为救世主。令人惊叹的