-4
CREATE TABLE STUDENT(
    SID CHAR(4),
    NAME VARCHAR(20) NOT NULL,
    EMAIL VARCHAR(20),
    PHONE VARCHAR(10),
    PRIMARY KEY(SID)
);

CREATE TABLE CLUB(
    CID CHAR(4),
    CNAME VARCHAR(50) NOT NULL,
    PRIMARY KEY(CID)
);

CREATE TABLE EVENT(
    EID CHAR(4),
    ENAME VARCHAR(50),
    EDATE TIMESTAMP,
    PRIMARY KEY(EID)
);


CREATE TABLE MEMBERSHIP(
    SID CHAR(4),
    CID CHAR(4),
    SEMESTER VARCHAR(10),
    MYEAR CHAR(4),
    FEE DECIMAL(5,2),
    FOREIGN KEY(SID) REFERENCES STUDENT(SID),
    FOREIGN KEY(CID) REFERENCES CLUB(CID),
    PRIMARY KEY(SID,CID,SEMESTER,MYEAR)
);

CREATE TABLE HOLDEVENT(
    EID CHAR(4),
    CID CHAR(4),
    MEMFEE DECIMAL(5,2),
    NONMEMFEE DECIMAL(5,2),
    FOREIGN KEY(EID) REFERENCES EVENT(EID),
    FOREIGN KEY(CID) REFERENCES CLUB(CID),
    PRIMARY KEY(EID,CID)
);


CREATE TABLE JOINEVENT(
    EID CHAR(4),
    SID CHAR(4),
    FEE DECIMAL(5,2),
    FOREIGN KEY(EID) REFERENCES EVENT(EID),
    FOREIGN KEY(SID) REFERENCES STUDENT(SID),
    PRIMARY KEY(EID,SID)
);

如何编写以下查询:

  1. 输出一起组织超过 5 场赛事的所有俱乐部对的名称?
  2. 输出自 1990 年秋季以来在每个学期加入 XYZ 的任何学生的 sid?
With temp(sem,tyear) as (select semester,n from (select unique semester from Membership),(select n from( select rownum n from dual connect by level <= Extract(year from sysdate)) where n >= 1990))        
select distinct sid from Membership M1 WHERE NOT EXISTS
(select * from temp WHERE NOT EXISTS
(select * from Membership M2 WHERE M1.sid = M2.sid AND M2.myear=temp.tyear AND M2.semester=temp.sem AND M2.cid in (select cid from Club where cname='Chess Club')));

请帮助识别此架构中的弱实体。

4

1 回答 1

0

以下是您如何完成这两项任务:

  1. 查询 HOLDEVENT 两次,这样您就可以得到一个事件、一个组织俱乐部和另一个组织俱乐部的记录。想办法不要同时得到 event = "Event 1" | club1 = "俱乐部 A" | club2 = "俱乐部 B" 和 event = "Event 1" | club1 = "俱乐部 B" | club2 = "俱乐部 A"。然后按俱乐部 1 和俱乐部 2 分组并过滤,以便您只获得那些组织了超过 5 个活动的配对。
  2. 计算每个学生自 1990 年以来成为会员的学期数。与自 1990 年以来的实际学期数进行比较。
于 2013-10-21T08:11:22.730 回答