Sql 如何在Oracle中进行此查询
我正在实现电影数据库,我在我的大学里有这个任务。 我有表格:Sql 如何在Oracle中进行此查询,sql,database,oracle,Sql,Database,Oracle,我正在实现电影数据库,我在我的大学里有这个任务。 我有表格:电影,人物,电影,奖项。人物和电影都有带有奖励id的字段,可以是NULL。 我不知道如何进行SQL查询,它将显示只在有奖项的电影中演出的人的列表。你能帮我吗 CREATE TABLE "LAB"."MOVIE" ( "MOVIE_ID" NUMBER NOT NULL ENABLE, "TITLE" VARCHAR2(219 BYTE) NOT NULL ENABLE, "YEARMADE" DATE,
电影
,人物
,电影
,奖项
。人物
和电影
都有带有奖励id的字段,可以是NULL
。
我不知道如何进行SQL查询,它将显示只在有奖项的电影中演出的人的列表。你能帮我吗
CREATE TABLE "LAB"."MOVIE"
( "MOVIE_ID" NUMBER NOT NULL ENABLE,
"TITLE" VARCHAR2(219 BYTE) NOT NULL ENABLE,
"YEARMADE" DATE,
"COUNTRY" VARCHAR2(40 BYTE),
"RUNNINGTIME" NUMBER,
"LANGUAGE" VARCHAR2(40 BYTE),
"TAG_ID" NUMBER NOT NULL ENABLE,
"REVIEW_ID" NUMBER,
"AWARD_ID" NUMBER,
PRIMARY KEY ("MOVIE_ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE,
FOREIGN KEY ("TAG_ID")
REFERENCES "LAB"."TAG" ("TAG_ID") ON DELETE CASCADE ENABLE,
FOREIGN KEY ("REVIEW_ID")
REFERENCES "LAB"."REVIEW" ("REVIEW_ID") ON DELETE CASCADE ENABLE,
CONSTRAINT "AWARD_ID" FOREIGN KEY ("AWARD_ID")
REFERENCES "LAB"."AWARD" ("AWARD_ID") ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
CREATE TABLE "LAB"."MOVIE_PEOPLE"
( "MOVIE_ID" NUMBER NOT NULL ENABLE,
"PEOPLE_ID" NUMBER NOT NULL ENABLE,
"ROLE" VARCHAR2(60 BYTE) NOT NULL ENABLE,
FOREIGN KEY ("MOVIE_ID")
REFERENCES "LAB"."MOVIE" ("MOVIE_ID") ON DELETE CASCADE ENABLE,
FOREIGN KEY ("PEOPLE_ID")
REFERENCES "LAB"."PEOPLE" ("PEOPLE_ID") ON DELETE CASCADE ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
CREATE TABLE "LAB"."PEOPLE"
( "PEOPLE_ID" NUMBER NOT NULL ENABLE,
"FAMILYNAME" VARCHAR2(40 BYTE) NOT NULL ENABLE,
"GIVENNAME" VARCHAR2(40 BYTE) NOT NULL ENABLE,
"GENDER" CHAR(1 BYTE) NOT NULL ENABLE,
"DATEOFBIRTH" DATE,
"TAG_ID" NUMBER,
"AWARD_ID" NUMBER,
PRIMARY KEY ("PEOPLE_ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE,
FOREIGN KEY ("TAG_ID")
REFERENCES "LAB"."TAG" ("TAG_ID") ON DELETE CASCADE ENABLE,
FOREIGN KEY ("AWARD_ID")
REFERENCES "LAB"."AWARD" ("AWARD_ID") ON DELETE CASCADE ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
CREATE TABLE "LAB"."AWARD"
( "AWARD_ID" NUMBER NOT NULL ENABLE,
"TITLE" VARCHAR2(40 BYTE) NOT NULL ENABLE,
"YEAR" DATE NOT NULL ENABLE,
PRIMARY KEY ("AWARD_ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ;
实现这一目标的一个方法是
WITH Q1 AS (SELECT DISTINCT p.PEOPLE_ID -- people who appeared in award-winning movies
FROM MOVIES m
INNER JOIN AWARDS a
ON a.AWARD_ID = m.AWARD_ID
INNER JOIN MOVIE_PEOPLE mp
ON mp.MOVIE_ID = m.MOVIE_ID
INNER JOIN PEOPLE p
ON p.PEOPLE_ID = mp.PEOPLE_ID),
Q2 AS (SELECT DISTINCT p.PEOPLE_ID -- people who appeared in non-award-winning movies
FROM MOVIES m
INNER JOIN MOVIE_PEOPLE mp
ON mp.MOVIE_ID = m.MOVIE_ID
INNER JOIN PEOPLE p
ON p.PEOPLE_ID = mp.PEOPLE_ID
WHERE m.AWARD_ID IS NULL)
SELECT Q1.PEOPLE_ID, p.*
FROM Q1
INNER JOIN PEOPLE p
ON p.PEOPLE_ID = Q1.PEOPLE_ID
LEFT OUTER JOIN Q2
ON Q2.PEOPLE_ID = Q1.PEOPLE_ID
WHERE Q2.PEOPLE_ID IS NULL
在这里,我们使用第一个CTE(Q1)查找所有在获奖电影中出现的人,第二个CTE(Q2)查找所有在未获奖电影中出现的人。(顺便说一句,你的设计有缺陷,因为电影可以赢得多个奖项,但没关系…)。在主查询中,我们将Q1中的所有人加入Q2,只保留出现在Q1中但不出现在Q2中的人
祝你好运。你试过什么?这并不是一个家庭作业应该以这种方式完成的地方。@DNac好吧,我没有很多想法,我试着印刷有奖和无奖的演员。这其实不是家庭作业,只是其中的一小部分。完整的任务是实现包含大量查询的数据库。所以我想找人帮忙。谢谢加入《人物》、《电影人》和《电影》。然后仅选择奖励不为空的电影。向我们显示您的表定义(如
create table
语句)。编辑您的问题,不要将其作为评论添加。请至少提供您的数据示例和所需的输出。好的,谢谢!现在我还有一个问题。我需要列出与导演合作的演员名单,他们的电影获得了3项以上的奥斯卡奖。我如何使用这里的柜台?或者有其他的方法吗?我建议你把这个作为另一个问题发布。谢谢