Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.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仅从第二个表中选择前3行_Sql_Oracle - Fatal编程技术网

sql仅从第二个表中选择前3行

sql仅从第二个表中选择前3行,sql,oracle,Sql,Oracle,我只需要子表中的3条记录 CREATE TABLE project (prj_code int , prj_name varchar(255) ); CREATE TABLE task (id int , prj_code int, task_name varchar(255) ); INSERT INTO project VALUES (1,'myproj1'); INSERT INTO project VALUES (2,'myproj2'); INSERT

我只需要子表中的3条记录

CREATE TABLE project
    (prj_code int , prj_name varchar(255) );


CREATE TABLE task
    (id int , prj_code int, task_name varchar(255) );

INSERT INTO project VALUES (1,'myproj1');    
INSERT INTO project VALUES (2,'myproj2');

INSERT INTO task VALUES (1,1,'testing');
INSERT INTO task VALUES (2,1,'prod');
INSERT INTO task VALUES (3,1,'prod2');
INSERT INTO task VALUES (4,1,'testing2');

INSERT INTO task VALUES (5,2,'mytask1');
INSERT INTO task VALUES (6,2,'mytask2');

编辑:


希望透视表为每个项目检索列中的3个smallests任务ID

此代码实现了这一点。您需要使用
RANK
选择3个最小的ID,然后选择透视表:

WITH tasks AS (
select 
   A.prj_code,
   prj_name,
   RANK() OVER (PARTITION BY A.PRJ_CODE ORDER BY ID ) RANK, 
   ID, 
   TASK_NAME
from task A
inner join project B
   on A.PRJ_CODE = B.PRJ_CODE
order by A.prj_code)


select PRJ_CODE, prj_name, sum(T1) T1, sum(T2) T2, sum(T3) T3
from tasks A
PIVOT (max(ID) for RANK IN ('1' as T1 ,'2' as T2 ,'3' as T3 )) B
GROUP BY PRJ_CODE, prj_name

使用下面的代码获得任务名称

select PRJ_CODE, prj_name, max(T1) T1, max(T2) T2, max(T3) T3
from tasks A
PIVOT (max(TASK_NAME) for RANK IN ('1' as T1 ,'2' as T2 ,'3' as T3 )) B
GROUP BY PRJ_CODE, prj_name

这是一个可怕的解决方案,但我认为它说明了实现这一点的方法。我不认为有任何旋转功能,因为我不知道您运行的是什么版本的Oracle

with tasks as (
  select
    a.prj_code, a.prj_name,
    b.id, b.task_name,
    row_number() over (partition by a.prj_code order by b.id) as rn
  from
    project a
    join task b on
      a.prj_code = b.prj_code
), pivotdata as (
  select
    prj_code, prj_name,
    case when rn = 1 then task_name end as task_1,
    case when rn = 2 then task_name end as task_2,
    case when rn = 3 then task_name end as task_3
  from tasks
)
select
  prj_code, prj_name,
  max (task_1) as task_1, max (task_2) as task_2,
  max (task_3) as task_3
from pivotdata
group by
  prj_code, prj_name
输出:

Prj Code   Prj Name    Task 1   Task 2  Task 3
1          myproj1     testing  prod    prod2
2          myproj2     mytask1  mytask2 

问题是什么?您尝试了什么?结果集应该是每个项目记录一行。对于项目表中的每个mataching记录,我需要表-task中的3条最新记录。我仍然可以看到,这是毫无疑问的。这里没有定义“第一个”和“最后一个”的概念。第一个和最后一个基于什么因素?pivot函数的很好的实用演示。