PL/SQL 语句的 SQL 查询不起作用

Posted

技术标签:

【中文标题】PL/SQL 语句的 SQL 查询不起作用【英文标题】:SQL Query for PL/SQL statement won't work 【发布时间】:2017-04-23 23:47:09 【问题描述】:

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

我做错了什么吗?我在查询下方包含了我的数据库代码。

查询:

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

员工表:

 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

是什么让 pnumber 代替 pno 起作用?

【问题讨论】:

您的代码中既没有游标也没有 PL/SQL - 它完全是 SQL。 “有什么不对的吗?”我们怎么可能知道?也许您的数据在 pno 列上是唯一的 - 在这种情况下,对于 HAVING COUNT(pno) > 1 过滤器,返回零行是正确的。 我诚挚的歉意。我对此进行了编辑以包括我的表格。此外,这是一条常规的旧 SQL 语句,稍后将包含在 PL/SQL 游标中。写问题时我完全监督 我完全可以编辑它以反映我的错误。如果我这样做,你能删除你的反对票吗?如果你当然是这样做的人。 @MT0,我真的觉得自己像个白痴。我非常专注于我的问题以及我知道我以后会使用它的东西,所以我发布了一个结构非常糟糕的问题。我希望我的编辑改进了它 这个问题仍然无法回答,因为没有示例数据可以证明这个问题。尝试使用填充表所需的 DML 语句以及您的预期输出(以及预期的原因)创建一个 minimal reproducible example。 【参考方案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

【讨论】:

我设法使这项工作改为:select fname, pname from employee,works_on, project where essn=ssn and pno=pnumber;按 fname 分组,pname 有 count(pnumber)>1;

以上是关于PL/SQL 语句的 SQL 查询不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 PL/SQL 过程不起作用?

PL/SQL NVL 和 OracleParameter 在 C# 中不起作用

为啥这个 PL/SQL 不起作用?

我的 PL/SQL 过程异常似乎不起作用

PL/SQL 正则表达式不起作用

过程中的 PL/SQL 游标不起作用