2017-04-23 55 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