首页 > 解决方案 > 尝试从 SQL 请求中获取表

问题描述

我现在正在做一个项目,我需要通过 SQL *PLUS 向我的数据库提出一些请求。

这就是我想要做的。我想得到一张表,在其中我得到带有这些条件的教授名字和姓氏(我必须验证第一个条件,然后是另一个):

这是创建数据库的代码:

CREATE TABLE Professor
(professorCode  CHAR(5) NOT NULL,
 lastName           VARCHAR(10) NOT NULL,
 firstName      VARCHAR(10) NOT NULL,
 CONSTRAINT PrimaryKeyProfessor PRIMARY KEY     (professorCode)
)
;

CREATE TABLE Group
(sigle      CHAR(7)     NOT NULL,
 noGroup    INTEGER     NOT NULL,
 sessionCode INTEGER        NOT NULL,
 maxInscriptions    INTEGER     NOT NULL,
 professorCode  CHAR(5) NOT NULL,
CONSTRAINT PrimaryKeyGroup PRIMARY KEY   
(sigle,noGroupe,sessionCode),
CONSTRAINT CESigleGroupeRefCours FOREIGN KEY    (sigle) REFERENCES Cours,
CONSTRAINT CECodeSessionRefSession FOREIGN KEY  (sessionCode) REFERENCES 
Session,
CONSTRAINT CEcodeProfRefProfessor FOREIGN KEY(professorCode) REFERENCES 
Professor
) 
;

这是我目前不工作的请求:

SELECT DISTINCT Professor.firstName, Professor.lastName
FROM            Professor, Group
WHERE           Group.professorCode = Professor.professorCode
                AND Group.sessionCode = 32003
                AND (Group.sigle = 'INF1130' AND
                     Group.sigle = 'INF1110')
                OR Group.sessionCode = 12004 
                AND (Group.sigle = 'INF3180' AND
                     Group.sigle = 'INF2110')

我知道有一种方法可以结合这两个结果,但我似乎找不到它。

在这种情况下,只有一个匹配可能

结果表应该如下所示:

--------------------------
First Name       Last Name
--------------------------
Denis            Tremblay

Gordon Linoff提出的解决方案看起来非常好,除了它没有返回任何表格,因为使用以下代码,它需要包含 4 个课程和 2 个 sessionCode。这里的问题是它需要验证条件并附加结果。假设会话 12004 的条件没有结果,那么我可以将其视为 NULL。然后,第二个条件,会话 32003,给了我一个匹配。它应该附加两个结果给我提供的表格。

我只想为此做一个请求。

多谢!

编辑:重新制定

EDIT2:举一个已知匹配的例子

EDIT3:进一步解释为什么建议的解决方案不起作用

标签: sqloraclesqlplus

解决方案


想: group byhaving。更重要的是,想想JOIN,,。 切勿在子句中使用逗号。JOINJOINfrom

SELECT p.firstName, p.lastName
FROM Professor p JOIN
     Group g
     ON g.professorCode = p.professorCode
WHERE (g.sessionCode, g.sigle) IN ( (32003, 'INF1130'), (32003, 'INF1110'),
                                    (12004, 'INF3180'), (12004, 'INF2110')
                                  )
GROUP BY p.firstName, p.lastName
HAVING COUNT(DISTINCT g.sigl) = 4;  -- has all four

推荐阅读