2017-04-23 61 views
0

我正在尝试执行一条SQL语句,我正在计划使用PL/SQL光标。如果他们正在处理多个项目,它将获取员工姓名和他们正在处理的项目。出于某种原因,“有数(pno)> 1”的规定在这里不起作用。它只是说“找不到数据”用于PL/SQL语句的SQL查询将不起作用

有什么我做错了吗?我在查询下面包含了我的DB代码。

查询:

select pname, fname 
from project, works_on, employee 
where pno=pnumber and essn=ssn 
group by pname, fname 
having count(pno)>1; 

Works_on表:

create table works_on (
Essn char(9) not null, 
Pno int not null, 
hours decimal(3,1), 
primary key(essn, pno), 
foreign key(Essn) references employee, 
foreign key(pno) references project); 

项目表:

create table project (
Pname varchar2(15) not null, 
Pnumber int  not null, 
Plocation varchar2(15), 
Dnum int not null, 
primary key (Pnumber), 
unique (Pname), 
foreign key(Dnum) references department(Dnumber)); 

Employee表:

create table employee (
Fname varchar2(15) not null, 
Minit char(1), 
Lname varchar2(15) not null, 
Ssn char(9), 
Bdate date, 
Address varchar2(30), 
Sex char(1), 
Salary decimal(10,2), 
super_ssn char(9), 
dno int, 
primary key (Ssn), 
foreign key (dno) references department(Dnumber)); 

编辑

我设法使这项工作,而不是:

select fname, pname 
    from employee, works_on, project 
    where essn=ssn and pno=pnumber 
    group by fname, pname 
    having count(pnumber) > 1 

什么代替PNO制成pnumber工作?

+0

有没有在你的代码中的光标也不PL/SQL - 这完全是SQL。 “有什么不对的吗?”我们怎么可能说?也许你的数据在'pno'列上是唯一的 - 在这种情况下返回零行对于'HAVING COUNT(pno)> 1'过滤器是正确的。 – MT0

+0

我真诚的道歉。我编辑了这个以包含我的表格。此外,这是一个普通的旧SQL语句,稍后将包含在PL/SQL游标中。在写这个问题时总是疏忽我 – Gary

+0

我可以绝对编辑这个来反映我的错误。如果我这样做,你可以删除你的downvote吗?如果你当然是做这件事的人。 – Gary

回答

1

我的预期输出是员工名字和项目名称列表,其中员工正在处理多个项目。

事情是这样的:

SELECT e.fname, p.projects 
FROM (
    SELECT w.essn, 
     LISTAGG(p.pname, ',') WITHIN GROUP (ORDER BY p.pname) AS projects 
    FROM works_on w 
     INNER JOIN 
     project p 
     ON (w.pno = p.pnumber) 
    GROUP BY w.essn 
    HAVING COUNT(DISTINCT w.pno) > 1 
) p 
INNER JOIN 
employee e 
ON (p.essn = e.ssn) 

或:

SELECT e.fname, 
     p.pname 
FROM (
     SELECT w.*, 
       COUNT(pno) OVER (PARTITION BY essn) AS num_projects 
     FROM works_on w 
     ) w 
     INNER JOIN 
     employee e 
     ON (e.ssn = w.essn) 
     INNER JOIN 
     project p 
     ON (w.pno = p.pnumber) 
WHERE w.num_projects > 1 
+0

非常感谢! – Gary

+0

我设法做这个工作,而不是:从雇员,work_on,项目 其中essn = ssn和pno = pnumber;选择fname,pname ; group by fname,pname having count(pnumber)> 1; – Gary

+0

什么让pnumber代替pno工作? – Gary