正在尝试从SQL请求获取表

正在尝试从SQL请求获取表,sql,oracle,sqlplus,Sql,Oracle,Sqlplus,我现在正在做一个项目,我需要通过SQL*PLUS向我的数据库发出一些请求 这就是我要做的。 我想得到一个表,其中我得到了教授的名字和姓氏以及这些条件(我必须验证第一个条件,然后是其他条件): (首先)在一次课程中(比如12004年),一位教授教授了这两门课程,INF3180和INF2110 (第二)在32003年的另一节课中,一位教授教授了这两门课,INF1130和INF1110 以下是创建数据库的代码: CREATE TABLE Professor (professorCode CHAR

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

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

  • (首先)在一次课程中(比如12004年),一位教授教授了这两门课程,INF3180INF2110

  • (第二)在32003年的另一节课中,一位教授教授了这两门课,INF1130INF1110

以下是创建数据库的代码:

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')
我知道有一种方法可以将这两种结果结合起来,但我似乎找不到

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

  • 只有一个与32003:INF1130、INF1110匹配
  • 与12004:INF3180、INF2110不匹配
生成的表应该如下所示:

--------------------------
First Name       Last Name
--------------------------
Denis            Tremblay
Gordon Linoff给出的建议解决方案看起来非常好,只是它没有返回任何表格,因为使用以下代码,它需要包含4个课程和2个sessionCode。这里的问题是,它需要验证这两个条件并附加结果。假设会话12004的条件没有结果,那么我可以认为它是空的。然后,第二个条件(会话32003)为我提供了一个匹配项。它应该附加这两个结果,为我提供上面的表格

我只想为这个做一个请求

非常感谢

编辑:重新制定

EDIT2:给出了一个已知匹配的示例


EDIT3:进一步解释建议的解决方案不起作用的原因

思考:
分组和
拥有
。更重要的是,想想
加入
加入
加入
。切勿在
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。不幸的是,您已经将其表示为和(即,他们必须教授所有四门课程——一对课程和另一门课程),而不是或(一套课程或另一套课程)

作为一种冗长的方式来扩展我认为你想要的东西:

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
的匹配数,方法是将其添加到group by子句中:

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
添加回,尽管这感觉有点错误。您还可以在中使用子查询和
,以避免:

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
,因为这不是一个有效的标识符;因为它是一个关键字。我假设您已更改了您的真实姓名-可能来自另一种语言?

不确定Oracle或sql plus,但您可能正在查找中的位置或存在的位置。因为一个记录不能同时满足两个条件。请提供符合条件和不符合条件的教授的示例。只有一个教授符合该请求。它仅对INF1110、INF1130和32003作出响应。没有人匹配INF3180、INF2110和12004。它必须显示刚刚添加了一个示例的那个@如果没有匹配的样本输入,GordonLinoffExample输出就没有帮助——包括不应该出现在结果集中的数据。您说您的查询“不起作用”,但这意味着什么?您是否遇到了错误?结果太多了?还不够?请在您的问题中包括当前结果以及样本数据,并解释其错误原因。以下是翻译后的问题:我们搜索教师的代码和姓名,不重复,在代码为12004的课程中,这些代码和姓名在INF3180和INF2110中同时教过。此外,代码和名称还包括在课程中教授过INF1130或INF1110课程的教师32003@GuillaumeLevesque . . . 这四个条件是教授教授教授所有四个班级。这就是这个查询的作用。对不起,英语不是我的主要语言。我要返回的表格是32003年教INF1130和INF1110的老师,以及12004年教INF3180和INF2110的老师。我的错,我不能正确地表达我自己,我工作得很好。我知道我做错了什么。非常感谢所有帮助我的人!是的,来自法语