2017-04-23 5 views
0

PL/SQLカーソルを使用してロードする予定のSQL文を実行しようとしています。 1つ以上のプロジェクトで作業している場合、従業員の名前と作業しているプロジェクトを取得します。何らかの理由で、「count(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)); 

EDIT

は、私が代わりにこの作業を行うために管理:

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

私の心から謝罪します。私はこれを編集してテーブルを入れました。また、これは後でPL/SQLカーソルに組み込まれる通常の古い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

従業員、works_on、プロジェクト 、 から、fname、pnameを選択してください。カウント(pnumber)> 1を有する グループ、fname、pnameによる ; – Gary

+0

pnoの代わりにpnumberが機能するのは何ですか? – Gary

関連する問題