正在尝试从 SQL 请求中获取 table

Attempting to get a table from SQL Request

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

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

这是创建数据库的代码:

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

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

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

结果 table 应该是这样的:

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

Gordon Linoff 提出的解决方案看起来非常好,除了它 returns 我没有 table 因为下面的代码,它需要包含 4 门课程和 2 session代码。这里的问题是它需要验证这两个条件并附加结果。假设 session 12004 的条件结果为空,那么我可以认为它是 NULL。然后,第二个条件 session 32003 给我一个匹配项。它应该附加这两个结果给我呈现的 table。

我只想为此做一个请求。

非常感谢!

编辑:重新制定

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

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

思考:group byhaving。更重要的是,想想 JOINJOINJOIN从不from 子句中使用逗号。

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

使用新式连接

SELECT Professor.firstName, Professor.lastName
FROM            Professor join "Group" g on
            g.professorCode = Professor.professorCode
               where  g.sessionCode in( 32003,12004 )
                AND g.sigle in( 'INF1130', 'INF1110','INF3180','INF2110')                        
             group by  Professor.firstName, Professor.lastName
             having count( distinct sigle )=4

您似乎想列出 在 32003 教过 INF1130 和 INF1110 的教授;或在 12004 年教授 INF3180 和 INF2110。不幸的是,您将其呈现为 AND(即他们必须教授所有四门课程——一对课程和另一门课程),而不是 OR(一组课程或另一门课程)。

作为扩展我认为您想要的内容的冗长方式:

SELECT p.firstName, p.lastName
FROM Professor p
WHERE (
  EXISTS (
    SELECT *
    FROM GroupX g
    WHERE professorCode = p.professorCode
    AND sessionCode = 32003
    AND sigle = 'INF1130'
  )
  AND EXISTS (
    SELECT *
    FROM GroupX g
    WHERE professorCode = p.professorCode
    AND sessionCode = 32003
    AND sigle = 'INF1110'
  )
)
OR (
  EXISTS (
    SELECT *
    FROM GroupX g
    WHERE professorCode = p.professorCode
    AND sessionCode = 12004
    AND sigle = 'INF3180'
  )
  AND EXISTS (
    SELECT *
    FROM GroupX g
    WHERE professorCode = p.professorCode
    AND sessionCode = 12004
    AND sigle = 'INF2110'
  )
);

四个子查询不会非常有效。您可以改用多重联接。

如果您一直在为每个 sessionCode 寻找两个 sigle 值,那么您可以修改 Gordon 的答案以计算每个 sigle 有多少匹配项,方法是将其添加到组中-按条款:

SELECT p.firstName, p.lastName
FROM GroupX g
JOIN Professor p
ON p.professorCode = g.professorCode
WHERE (g.sessionCode, g.sigle) IN ( (32003, 'INF1130'), (32003, 'INF1110'),
                                    (12004, 'INF3180'), (12004, 'INF2110')
                                  )
GROUP BY p.firstName, p.lastName, g.sessionCode
HAVING COUNT(*) = 2;

如果您确实有一位教授所有这四门课程的教授,那么您会把他们列出两次;如果发生这种情况,您可以将 DISTINCT 重新添加进去,尽管这感觉有点不对劲。您还可以使用子查询和 IN 来避免这种情况:

SELECT p.firstName, p.lastName
FROM Professor p
WHERE ProfessorCode IN (
  SELECT professorCode
  FROM GroupX
  WHERE (sessionCode, sigle) IN ( (32003, 'INF1130'), (32003, 'INF1110'),
                                  (12004, 'INF3180'), (12004, 'INF2110')
                                )
  GROUP BY professorCode, sessionCode
  HAVING COUNT(*) = 2
)

(我已将 Group 更改为 GroupX,因为那不是有效的标识符;因为它是关键字。我假设您已经更改了您的真实姓名 - 也许来自另一种语言? )